总结ES6扩展运算符

161 阅读2分钟

含义

扩展运算符(spread)是三个点(...),好比rest参数的逆运算,将一个数组转为用逗号分隔的参数序列。

console.log(...[1,2,3])
// 1 2 3
console.log(1,...[2,3,4],5)
// 1 2 3 4 5
[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]

该运算符主要用于函数调用。

function push(array,...items){
  array.push(...items);
}

function add(x, y){
return x + y;
}
const numbers =[4,38];
add(...numbers)// 42

上面代码中,array.push(...items)add(...numbers)这两行,都是函数的调用,它们都使用了扩展运算符。该运算符将一个数组,变为参数序列。


替换apply

扩展运算符可以展开数组,代替apply()将数组转化为函数参数的需求。

//ES5
Math.max.apply(null, [1, 3, 5]);

//ES6
Math.max(...[1, 3, 5]); 

合并数组

//ES5
var arr1 = [8]
var arr2 = [9,11,12,13]
arr1.push(arr2);
//[8,[9,11,12,13]]
Array.prototype.push.apply(arr1,arr2);
//[8,9,11,12,13]

// ES6
arr1.push(...arr2);
console.log(arr1)
//[8,9,11,12,13]

//可以直接写
var newArr = [...arr1, ...arr2]
console.log(newArr)

解构赋值

var [a, ...b] = [2,3,4,5,6];
console.log(a, b);
//2 [3,4,5,6]
var [c, ...d] = [2];
console.log(c, d);
//2 []
var [...x,y] = [2,3,4,5,6];
//Uncaught SyntaxError: Rest element must be last element

当扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。


数组和对象的拷贝

var arr1 = [1, 2, 3];
var arr2 = [...arr1];

console.log(arr1 === arr2) // false

arr2.push(4); // 修改arr2,不会影响arr1的值

console.log(arr1); // [1, 2, 3]
console.log(arr2); // [1, 2, 3, 4]

对象也一样

var obj1 = {
    a: 1,
    b: 2
};

var obj2 = {...obj1};

console.log(obj1 === obj2); // false

obj2.c = 3; // 修改obj2不会影响obj1
console.log(obj1); // {a: 1, b: 2}
console.log(obj2); // {a: 1, b: 2, c: 3}

注意:扩展运算符拷贝是浅拷贝,只对数组或对象的第一层结构起作用


对象的扩展运算符

var {a, b, ...c} = {a : 12, b : 23, d : 34, c : 345}
//c ->{d:34,c:345}

var obj = {name : 'coco'}
var obj1 = {age : 27}
var newObj = {...obj, ...obj1};
var newObj1 = {obj, obj1};
console.log(newObj);//{name: "coco", age: 27}
console.log(newObj1);//{name: "coco"} {age: 27}


字符串转数组

var strArr = [...'kiwi']
console.log(strArr)
//["k","i","w","i"]