在javascript中使用rest参数和spread运算符

Tar*_*lah 15 javascript ecmascript-5 ecmascript-6 spread-syntax

在ECMAScript 6中添加的rest参数的用途是什么?

例如,在ECMAScript 5中,您可以执行以下操作以从第二个元素开始获取参数数组:

// ES 5
store('Joe', 'money');
store('Jane', 'letters', 'certificates');
function store(name) {
  var items = [].slice.call(arguments, 1); //['money'] in first case
  items.forEach(function (item) {
    vault.customer[name].push(item);
  });
}
Run Code Online (Sandbox Code Playgroud)

这将等同于ECMAScript 6中的以下代码:

// ES 6
store('Joe', 'money');
store('Jane', 'letters', 'certificates');
function store(name, ...items) {
  items.forEach(function (item) {
    vault.customer[name].push(items)
  });
}
Run Code Online (Sandbox Code Playgroud)

它们之间的区别仅仅是语法还是存在性能问题?

也适用于传播运营商(...)

//in ecmascript5
var max = Math.max.apply(null, [14, 3, 77]);
//but in ecmascript6
var max = Math.max(...[14, 3, 77]);
Run Code Online (Sandbox Code Playgroud)

这只是语法更改还是性能问题?

kan*_*gax 19

它们之间的区别仅仅是语法还是存在性能问题?

两者都是......

休息参数:

  1. 是其他语言中的已知习语(Ruby,Python).
  2. 易于阅读和维护(vs. slice).
  3. 比较容易理解,适合初学者.
  4. 可以(并且可能会)产生更好的性能,因为引擎可以优化.
  5. 工具友好,因为他们可以静态分析.


Kri*_*wal 18

除了@kangax的回复之外,我还会详细说明,在arguments调用对象时,性能和正确性很多都是有问题的.如果将arguments对象传递给另一个函数,则会向其传递权限以修改范围中的相应局部变量.

function foo(arg) {
    bar(arguments);
    return arg;
}

function bar(args) {
    args[0] = 20;
}

foo(10) // 20
Run Code Online (Sandbox Code Playgroud)

此功能的存在使函数内的局部推理无效,这使得JIT优化更加困难并且引入了某些安全隐患.为速度而设计的程序必须解决这个问题,使用比Array.prototype.slice.call(arguments)习语更精细的样板代码,并且在安全上下文中,arguments必须严格禁止传递.

消除使用该arguments对象提取可变参数的需要是新语法的众多优点之一.


Haz*_*ass 3

我认为rest参数的主要区别是:

  • ECMA5 参数中的参数就像数组而不是数组,因此数组普通方法不可用,但在 ECMA6 中参数是数组。
  • 我认为在 ECMA5 代码示例中构建 items 数组会使代码变慢一些,因为新数组已实例化。