本文介绍了ES6中的…操作符的使用场景和使用方法。本文参考自Joy Warugu的《Javascript’s three dots ( … ): Spread vs rest operators》。
ES6 …操作符
ES6推出的 … 操作符,在不同的使用场景(context)下,会有不同的作用效果。
用途1
作为“剩余参数”(rest parameter)的替代物。在调用函数并传入参数时,会把剩余的参数收集起来,并加入到一个数组中。
// 例1 function add(...args) { let result = 0; for (let arg of args) result += arg; return result } add(1) // returns 1 add(1,2) // returns 3 add(1, 2, 3, 4, 5) // returns 15 // 例2 function xyz(x, y, ...z) { console.log(x, ' ', y); // hey hello console.log(z); // ["wassup", "goodmorning", "hi", "howdy"] console.log(z[0]); // wassup console.log(z.length); // 4 } xyz("hey", "hello", "wassup", "goodmorning", "hi", "howdy")
应用场景:代替arguments。
arguments有2个缺点:
arguments只是“伪数组”,它不是真正的数组,只有数组的“索引”、“length”的特性,而没有其他数组应该有的方法(find、filter、map等)。
在箭头函数中不能使用arguments,因为箭头函数中没有它们自己的this,因此也不存在arguments对象。
...
操作符会产生1个数组,因此拥有数组所拥有的所有方法(find、filter、map等)。
用途2
作为“扩展操作符”(spread operator)。用来把可迭代(iterable)的类型(array、string等)中的进行扩展,扩展成为单个元素。
// 例1:把一个数组中的全部元素,添加到一个已经存在的数组中 const arr = ["Joy", "Wangari", "Warugu"]; const newArr1 = ["joykare", ...arr]; // ["joykare", "Joy", "Wangari", "Warugu"] const newArr2 = [...arr, "joykare"]; // ["Joy", "Wangari", "Warugu", "joykare"] // 例2:复制数组 // 把arr中的内容,拷贝到arr2中。然后,当我们对arr2进行任何改变或者操作时,都不会对原来的arr产生任何的影响。 // 注意,若数组中元素是对象,那么拷贝的时候只会拷贝对象的引用(指针)。因此若修改拷贝出来的数组中的对象中的某个属性,会影响到原来的数组。 const arr = [1, 2, 3]; const arr2 = [...arr]; // [1, 2, 3] arr2.push(4); // arr2 == [1, 2, 3, 4] arr1 // arr1 == [1, 2, 3] // 例3:将数组的元素作为单独的参数传递给函数 function add(a, b, c) { return a + b + c ; } const args = [1, 2, 3]; add(...args); // 6