展开语法(...)是一种将数组或对象展开成单独元素(或键值对)的简便方式。
// 数组展开
const arr = [1, 2, 3];
const newArr = [...arr]; // [1, 2, 3]
// 对象展开
const obj = { a: 1, b: 2 };
const newObj = { ...obj }; // { a: 1, b: 2 }
创建一个数组的浅拷贝,避免直接引用同一数组。
const arr = [1, 2, 3];
const copy = [...arr];
copy.push(4);
console.log(arr); // [1, 2, 3]
console.log(copy); // [1, 2, 3, 4]
合并多个数组成一个新数组。
const arr1 = [1, 2];
const arr2 = [3, 4];
const merged = [...arr1, ...arr2];
console.log(merged); // [1, 2, 3, 4]
插入新的元素,同时保留原数组元素。
const arr = [1, 2, 3];
const newArr = [0, ...arr, 4];
console.log(newArr); // [0, 1, 2, 3, 4]
展开数组元素作为函数的参数。
const numbers = [1, 2, 3];
console.log(Math.max(...numbers)); // 3
创建一个对象的浅拷贝。
const obj = { a: 1, b: 2 };
const copy = { ...obj };
console.log(copy); // { a: 1, b: 2 }
const obj1 = { a: 1 };
const obj2 = { b: 2 };
const merged = { ...obj1, ...obj2 };
console.log(merged); // { a: 1, b: 2 }
const obj = { a: 1, b: 2 };
const newObj = { ...obj, b: 3, c: 4 };
console.log(newObj); // { a: 1, b: 3, c: 4 }
const obj = { a: 1, b: 2, c: 3 };
const { a, ...rest } = obj;
console.log(a); // 1
console.log(rest); // { b: 2, c: 3 }
使用展开语法复制数组或对象时,仅进行浅拷贝。
const obj = { nested: { key: "value" } };
const copy = { ...obj };
copy.nested.key = "newValue";
console.log(obj.nested.key); // "newValue" (原对象受影响)
当多个对象有相同的属性时,后面的对象属性会覆盖前面的属性。
const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const merged = { ...obj1, ...obj2 };
console.log(merged); // { a: 1, b: 3, c: 4 }
只有可迭代对象(如数组、字符串、Map、Set 等)才能用于数组的展开语法。
console.log([...123]); // TypeError: 123 is not iterable