ES6实用技巧:参数校验、reduce高阶用法与解构语法
本文介绍ES6中的多项实用技巧,包括利用默认参数机制实现强制参数校验、深入解析reduce方法在同时执行map与filter、括号匹配及统计中的应用,以及对象和数组解构在属性过滤、嵌套取值、合并与交换数值等方面的具体用法。
如果您还有其他相关技巧,欢迎在评论区留言分享,我们将整理补充。
1. 强制要求参数
ES6引入了默认参数值机制,允许为函数参数指定默认值,从而避免调用时未传递参数导致的意外行为。
示例中定义了一个required()函数,将其作为参数a和b的默认值。若调用时未传入a或b,将触发required()并抛出错误。
const required = () => {throw new Error('Missing parameter')};
const add = (a = required(), b = required()) => a + b;
add(1, 2) //3
add(1) // Error: Missing parameter.
2. 强大的reduce
数组的reduce方法应用广泛,通常用于将数组元素归约为单一值。但通过巧妙运用,它可以实现更多功能。
2.1 使用reduce同时实现map和filter
假设有一个数列,需要对其每一项进行更新(map功能)并筛选出部分结果(filter功能)。若分别调用map和filter,需遍历数组两次。
以下代码展示了如何将数列值翻倍,并筛选出大于50的数。通过reduce可以高效地同时完成map和filter的操作。
const numbers = [10, 20, 30, 40];
const doubledOver50 = numbers.reduce((finalList, num) => {
num = num * 2;
if (num > 50) {
finalList.push(num);
}
return finalList;
}, []);
doubledOver50; // [60, 80]
2.2 使用reduce取代map和filter
通过上述代码可以看出,reduce具备替代map和filter的能力。
2.3 使用reduce匹配圆括号
reduce的另一个用途是验证字符串中圆括号的匹配情况。对于包含括号的字符串,需确保(和)数量一致,且(始终出现在)之前。
以下代码利用reduce解决该问题。首先声明计数器counter初始值为0,遇到(时加一,遇到)时减一。若左右括号数量匹配,最终结果为0。
//Returns 0 if balanced.
const isParensBalanced = (str) => {
return str.split('').reduce((counter, char) => {
if(counter < 0) { //matched ")" before "("
return counter;
} else if(char === '(') {
return ++counter;
} else if(char === ')') {
return --counter;
} else { //matched some other char
return counter;
}
}, 0); //<-- starting value of the counter}
isParensBalanced('(())') // 0 <-- balanced
isParensBalanced('(asdfds)') //0 <-- balanced
isParensBalanced('(()') // 1 <-- not balanced
isParensBalanced(')(') // -1 <-- not balanced
2.4 统计数组中相同项的个数
当需要统计数组中重复项的出现次数并用对象表示时,可以使用reduce处理该数组。
以下代码统计每种汽车的数量,并将结果封装为一个对象。
var cars = ['BMW','Benz', 'Benz', 'Tesla', 'BMW', 'Toyota'];
var carsObj = cars.reduce(function (obj, name) {
obj[name] = obj[name] ? ++obj[name] : 1;
return obj;
}, {});
carsObj; // => { BMW: 2, Benz: 2, Tesla: 1, Toyota: 1 }
reduce的其他应用场景众多,建议参考MDN的相关代码示例。
3. 对象解构
3.1 删除不需要的属性
有时需移除对象中的某些属性,可能因涉及敏感信息或体积过大。与其枚举并删除,不如将这些无用属性赋值给变量,剩余部分作为剩余参数保存。
以下代码中,希望移除_internal和tooBig属性。可将它们赋值给internal和tooBig变量,cleanObject中则保留其余属性。
let {_internal, tooBig, ...cleanObject} = {el1: '1', _internal:"secret", tooBig:{}, el2: '2', el3: '3'};
console.log(cleanObject); // {el1: '1', el2: '2', el3: '3'}
3.2 在函数参数中解构嵌套对象
以下代码中,engine是对象car中的嵌套对象。若需获取engine的vin属性,使用解构赋值可轻松实现。
var car = {
model: 'bmw 2018',
engine: {
v6: true,
turbo: true,
vin: 12345
}
}
const modelAndVIN = ({model, engine: {vin}}) => {
console.log(`model: ${model} vin: ${vin}`);
}
modelAndVIN(car); // => model: bmw 2018 vin: 12345
3.3 合并对象
ES6引入了扩展运算符(...)。虽然常用于数组解构,但同样适用于对象处理。
接下来,使用扩展运算符展开新对象,第二个对象的属性值将覆盖第一个对象的同名属性。例如object2的b和c会改写object1的同名属性。
let object1 = { a:1, b:2,c:3 }
let object2 = { b:30, c:40, d:50}
let merged = {…object1, …object2} //spread and re-add into merged
console.log(merged) // {a:1, b:30, c:40, d:50}
4. Sets
4.1 使用Set实现数组去重
在ES6中,由于Set仅存储唯一值,可利用Set删除数组中的重复项。
let arr = [1, 1, 2, 2, 3, 3];
let deduped = [...new Set(arr)] // [1, 2, 3]
4.2 对Set使用数组方法
通过扩展运算符可将Set转换为数组,从而对Set应用Array的所有原生方法。
例如,对以下Set进行filter操作,获取大于3的项。
let mySet = new Set([1,2, 3, 4, 5]);
var filtered = [...mySet].filter((x) => x > 3) // [4, 5]
5. 数组解构
有时函数返回的多个值会封装在数组中。通过数组解构,可以分别获取每个值。
5.1 数值交换
let param1 = 1;
let param2 = 2;
//swap and assign param1 & param2 each others values
[param1, param2] = [param2, param1];
console.log(param1) // 2
console.log(param2) // 1
5.2 接收函数返回的多个结果
以下代码中,从/post获取帖子,从/comments获取相关评论。由于使用async/await,函数将返回值放入数组。通过数组解构,可直接将返回值赋给相应变量。
async function getFullPost(){
return await Promise.all([
fetch('/post'),
fetch('/comments')
]);
}
const [post, comments] = getFullPost();
注:原文作者rajaraodv,白吟灵译。
JavaScript闭包与类(Class)的区别及适用场景对比
2026-11-05 15:48:57
JavaScript入门要学ES6吗?let与箭头函数等新特性解析
2026-11-05 14:49:16
JavaScript 8种数据类型详解:基本类型与引用类型的区别
2026-11-05 14:25:15
怎么在JavaScript中使用async/await优化Ajax异步流程
2026-11-05 13:56:15
JavaScript replace回调函数实现动态正则替换逻辑
2026-11-05 13:52:13
