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
它们之间的区别仅仅是语法还是存在性能问题?
两者都是......
休息参数:
slice).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对象提取可变参数的需要是新语法的众多优点之一.
我认为rest参数的主要区别是: