Unknown Me

展开运算符和剩余参数

最近看源码的时候经常被 ... 绕晕,果断恶补一番,以下是学习笔记

# 展开运算符 (Spread Operator)

特点:

  1. 运算符后面的变量是预先定义的
  2. 那个变量只能是数组
  3. 顾名思义,单 -> 多,把它展开来
  4. array -> multiple elements

# 用于函数调用:

var arr = [1, 2, 3];
myFunction(...arr);

// 相当于
myFunction.apply(undefined, arr)

会把传入的数组自动分解成多个参数

# 用于数组字面量:

var arr = [1, 2, 3];
[...arr, 4, 5, 6];

// 相当于
[].concat(arr, [4, 5, 6])

会把数组拆分成多个元素,然后再并入另一个数组

# 用于字符串:

var str = '1234';
Math.max(...str) // => 4

会把字符串拆分成多个元素

# 剩余参数 (Rest parameters)

特点:

  1. … 后面的变量是新的形参
  2. 产出的变量会是数组
  3. 必须是参数的最后一个
  4. 顾名思义,只影响剩余部分,多 -> 单
  5. array-like (only the rest part) -> array

# 函数定义时:

function test(a, b, ...args) {
  console.log(args); // => [3, 4]
}

test(1, 2, 3, 4);

会把 arguments 剩余的部分 自动转换成 真正的数组

# 数组解构:

var [a, ...args] = [1, 2, 3, 4];
a // => 1
args // => [2, 3, 4]

# 参考

  • https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_operator
  • https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Rest_parameters
  • http://stackoverflow.com/questions/33898512/spread-operator-vs-rest-parameter-in-es2015-es6