ECMAScript6-扩展运算符

92 阅读1分钟

基本使用

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>]

let number = [10, 20]
function add(x, y) {
  return x + y
}
add(...number) // 30

其他应用

替代函数的 apply 方法

// ES5
function f(x, y, z) {
  console.log(x, y, z)
}
var args = [0, 1, 2]
f.apply(null, args) // 依次输出 0 1 2
f(args) // 不使用 apply 依次输出 [0, 1, 2] undefined undefined

// ES6
function f(x, y, z) {
  console.log(x, y, z)  
}
let args = [0, 1, 2]
f(...args) // 依次输出 0 1 2

求出一个数组最大元素

// ES5
Math.max.apply(null, [14, 3, 77])
// ES6
Math.max(...[14, 3, 77]) // 等同于 Math.max(14, 3, 77)

由于 JavaScript 不提供求数组最大元素的函数,所以只能盗用 Math.max 函数,将数组数组转为一个参数序列,然后求最大值。ES6 有了扩展运算符后,就可以直接用 Math.max 了。

将数组添加到另一数组尾部

// ES5
var arr1 = [0, 1, 2]
var arr2 = [3, 4, 5]
Array.prototype.push.apply(arr1,arr2)
arr1.concat(arr2)

// ES6
arr1.push(...arr2)

上面代码的 ES5 写法中,push 方法的参数不能是数组,所以只好通过 apply 方法变通使用 push 方法。ES6 有了扩展运算符,就可以直接将数组传入 push 方法。

复制数组

// ES5
const a1 = [1, 2]
const a2 = a1.concat()

// ES6
const a1 = [1, 2]
const a2 = [...a1]

合并数组

let arr1 = [1, 2, 3]
let arr2 = [4, 5, 6]
let arr3 = [...arr1, ...arr2]

它们的成员都是对原数组成员的引用,这就是浅拷贝。如果修改了引用指向的值,会同步反映到新数组。

合并对象

let obj1 = { name:'lxx' }
let obj2 = { age:25, pets:'panda' }
let obj3 = { ...obj1, ...obj2 }

等同于 Object.assign()

let obj3 = Object.assign({}, obj1, obj2)