对于 Javascript,是什么阻止现代实现不将参数视为真正的数组?

2024-04-15

我认为这是一个旧的 Javascript 行为(Crockford 说这是一个设计错误),在函数内部,arguments就像一个数组,只不过它不是一个真正的数组,因此不能对其调用数组方法:

function foo() { console.log(arguments.slice(1)) }   // won't work
foo(1,2,3);

我刚刚在最新的 Firefox 和 Chrome 上尝试过,但两者都不起作用。 所以我们可能不得不使用

function foo() { console.log(Array.prototype.slice.call(arguments, 1)) }
foo(1,2,3);

但为什么不让arguments现代 JavaScript 中的真正数组?可能不应该有任何程序依赖于arguments不是一个真正的数组?现在不将其设为真正的数组的原因可能是什么?

我能想到的一个原因是,如果程序员开始将其视为数组,那么代码将无法在较旧的浏览器中运行,但 ECMA-5 中的其他内容也无法在较旧的浏览器中运行。


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

2009 年 8 月,Apple 的 Oliver Hunt 将其发布到 es5-discuss 邮件列表

https://mail.mozilla.org/pipermail/es5-discuss/2009-August/003112.html https://mail.mozilla.org/pipermail/es5-discuss/2009-August/003112.html

我实现了使 Arguments 对象继承自 Array 的逻辑 上周五出现在 WebKit 中,很快就出现了严重的问题
与 Prototype.js 不兼容 ... 这至少破坏了一些苹果网站和 Nasa.gov—— ... 由于主要兼容性问题导致这些站点损坏
在一个相当大的图书馆中,尝试改造似乎是不可行的
参数上的类似数组的行为。

TC39 的其余部分同意 Oliver 的评估,并且该功能已从最终草案中删除。

也许,这样的代码已经从网络上消失了,所以提议的 ES5 解决方案今天仍然可以工作。不过,这并不重要,因为 ES6 中的剩余参数是对问题的更好解决方案,并且是一个全新的语法功能,不会与现有代码产生任何向后兼容性问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于 Javascript,是什么阻止现代实现不将参数视为真正的数组? 的相关文章

随机推荐