扩展运算符是三个点(...)。个人认为是对于数组操作的简化版。(千万不要因为漏打一个点报错啊!!)
简化apply方法
一、展开数组
function doSth(a,b,c){
return a+b+c
}
这里我们传参一般为
doSth(1,2,3) //6。
参数为数组let arr = [1,2,3],那么可能我们要手动展开传参,但扩展运算符可以简化这部操作。
doSth(...[1,2,3]) //6
或者
doSth(...arr) //6 (后面就不展示这种方式了!)
二、取最大值
Math.max.apply(null,[11,5,20]) //20
Math.max(...[11,5,20]) //20
Math.max(11,5,20) //20
扩展运算符就是展开数组成为参数序列。
三、push一个数组到另一数组尾部
let arr1 = [1,2]
let arr2 = [3,4]
Array.prototype.push.apply(arr1,arr2) //[1,2,3,4]
//用到扩展运算符:
arr1.push(...arr2) //[1,2,3,4]
是不是方便到家!(前者是因为ES5中push参数无法是数组)
四、复制数组
数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组。
let arr1 = [1,2]
let arr2 = arr1
arr2[0] = 2
arr1 //[2, 2]
我们改变了arr2,arr1也改变了。说明arr2并不是arr1的克隆,而是指向同一份数据的另一个指针。修改arr2,会直接导致arr1的变化。我们可以这样:
let arr1 = [1,2]
let arr2 = arr1.concat()
arr2[0] = 2
arr1 //[1, 2]
这样就不会影响arr1了。我们用扩展运算符呢?
let arr1 = [1,2]
let arr2 = [...arr1]
//或
let [...arr2] = arr1
两种写法都可以。
五、合并数组
let arr1 = [0,1,2]
let arr2 = [3,4,5]
let arr3 = [6,7,8]
arr1.concat(arr2,arr3) //[0,1,2,3,4,5,6,7,8]
//扩展运算符:
[...arr1,...arr2,...arr3] //[0,1,2,3,4,5,6,7,8]
以上两种方法都是浅拷贝,修改一个数组中的值都会影响合并数组中的值。
权威参考ES6:http://es6.ruanyifeng.com/?search=%E6%89%A9%E5%B1%95%E8%BF%90%E7%AE%97%E7%AC%A6&x=0&y=0#docs/array