ES6实用技巧:参数校验、reduce高阶用法与解构语法

作者:半夏

时间:2026-10-22

浏览:411

本文介绍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,白吟灵译。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章