ES6实用技巧:参数校验、Reduce进阶与解构语法
本文整理ES6中的实用技巧,包括使用默认参数实现强制校验、利用reduce同时执行map和filter操作、匹配圆括号及统计重复项。此外,还涵盖对象与数组解构的高级用法,如提取属性、合并对象、数值交换及处理异步返回值,帮助提升代码效率。
引言
ES6标准发布已有数年,其诸多新特性在项目中得到了巧妙应用。本文旨在梳理其中部分实用技巧,期望对开发者有所助益。
若您掌握其他相关技巧,欢迎在评论区留言分享,我将据此补充完善内容。
强制要求参数与Reduce进阶
1. 强制要求参数
ES6引入了默认参数值机制,允许为函数参数设定默认值,从而避免调用时缺失参数导致的潜在问题。
示例中定义了一个required()函数,并将其作为参数a和b的默认值。若调用时未传入a或b,将触发该函数并抛出错误。
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,需遍历数组两次。
下方代码展示了如何高效利用reduce,在单次遍历中将数值翻倍并筛选出大于50的数,从而同时完成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轻松解决此问题:声明初始值为0的counter变量,遇到左括号加一,右括号减一。若最终结果为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赋值给对应变量,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}
Set集合与数组解构技巧
4. Sets
4.1 使用Set实现数组去重
ES6中,由于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();
总结与资源
如需查看更多我翻译的Medium文章,请访问:
项目地址:https://github.com/WhiteYin/translation SF专栏:https://segmentfault.com/blog/yin-translation
总结
以上介绍了ES6中的一些实用技巧,希望能对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持!
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
