arguments.slice() 应该在 ES5 中工作吗?

bre*_*ine 2 javascript function ecmascript-5 ecmascript-3

我正在Javascript 上观看Crockford - 第三幕:在大约 41 分 26 秒时发挥终极作用。他屏幕上的代码arguments.slice()以一种导致出错的方式使用。

function curry(func){
    var args = arguments.slice(1);
    ...
}
Run Code Online (Sandbox Code Playgroud)

他是这样解释的:

我将首先得到一个参数数组,除了第一个,因为第一个是一个函数,我不需要那个。在这种情况下,我假设我在 ES5 上,所以我没有做可怕的 Array.prototype.apply()把戏。

问题是运行会arguments.slice()导致此错误:

Uncaught TypeError: arguments.slice is not a function

我正在测试肯定有 ES5 的现代浏览器!我可以让代码工作的唯一方法是,如果我使用一些“可怕的”技巧,(如他所称),例如Array.prototype.slice.apply(arguments, [1])[].slice.call(arguments, 1);.

他只是误会了吗?他的幻灯片有错别字吗?为什么arguments.slice()在我的 ES5 浏览器中不起作用?

Fab*_*tté 5

引用TC39 成员 Allen Wirfs-Brock:

直到 ECMAScript 5 开发的后期,参数对象才会继承所有 Array.prototype 方法。但是 2009 年 9 月 TC39 批准的 ES5 的“最终草案”没有这个功能。

让 arguments 对象从 Array 原型继承其实是计划好的,但是当它付诸实践时,它打破了 web。因此,它在正式出版前从最终修订版中删除。


如今,随着 ECMAScript 2015(又名 ES6)标准化,最好的方法是使用rest 参数

function curry(func, ...args) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

相当于 ES5:

function curry(func) {
  var args = [].slice.call(arguments, 1);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

此功能已在 Firefox 和 Edge 中原生可用,如果您使用 JavaScript 编译器(例如Babel ),则可以在任何地方使用。