2. ...展开
展开语法 ... 允许一个表达式在期望多个参数(用于函数调用)或多个元素(用于数组字面量)或多个变量(用于解构赋值)的位置展开。它主要有以下几种用途:
- 在函数调用中展开数组
- 在数组字面量中展开数组
- 在对象字面量中展开对象
- 用于数组或对象的浅拷贝
- 在函数定义中收集剩余参数
让我们通过一些例子来看看展开语法的不同用法:
// 1. 在函数调用中展开数组
function sum(x, y, z) {
return x + y + z;
}
const numbers = [1, 2, 3];
console.log('Sum:', sum(...numbers)); // 等同于 sum(1, 2, 3)
// 2. 在数组字面量中展开数组
const parts = ['shoulders', 'knees'];
const body = ['head', ...parts, 'toes'];
console.log('Body parts:', body);
// 3. 在对象字面量中展开对象
const obj1 = { foo: 'bar', x: 42 };
const obj2 = { foo: 'baz', y: 13 };
const mergedObj = { ...obj1, ...obj2 };
console.log('Merged object:', mergedObj);
// 4. 用于数组的浅拷贝
const originalArray = [1, 2, 3];
const copiedArray = [...originalArray];
console.log('Copied array:', copiedArray);
// 5. 在函数定义中收集剩余参数
function myFunction(firstArg, ...restArgs) {
console.log('First argument:', firstArg);
console.log('Rest of the arguments:', restArgs);
}
myFunction('a', 'b', 'c', 'd');
// 6. 在解构赋值中使用
const [first, ...rest] = [1, 2, 3, 4, 5];
console.log('First:', first);
console.log('Rest:', rest);
// 7. 使用展开语法将 Set 转换为 Array。
const myArray = ["value1", "value2", "value3"];
// 使用常规的 Set 构造函数将 Array 转换为 Set
const mySet = new Set(myArray);
mySet.has("value1"); // 返回 true
console.log([...mySet]); // 将显示与 myArray 完全相同的数组
这些例子展示了展开语法的多种用途:
- 在函数调用中,我们可以用
...展开一个数组,使其元素作为独立的参数传递。 - 在创建新数组时,我们可以轻松地将一个数组的所有元素插入到另一个数组中。
- 对于对象,我们可以快速合并多个对象的属性。
- 展开语法提供了一种简单的方式来创建数组的浅拷贝。
- 在函数定义中,
...可以用来收集剩余的参数into一个数组。 - 在解构赋值中,
...可以用来将剩余的元素收集到一个新的数组中。
展开语法的优点:
- 代码更简洁、更易读。
- 减少了使用
apply()方法或concat()等函数的需求。 - 提供了一种更直观的方式来处理数组和对象。
需要注意的是,对于对象的展开,如果有重复的属性名,后面的值会覆盖前面的值(如例子中的 foo 属性)。
展开语法是 ES6(ECMAScript 2015)引入的特性,现在在现代 JavaScript 开发中被广泛使用,特别是在 React 等框架中处理 props 和 state 时非常常见。