首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于Javascript来说,是什么阻止了现代实现不将参数视为实数组?

对于Javascript来说,是什么阻止了现代实现不将参数视为实数组?
EN

Stack Overflow用户
提问于 2012-11-02 04:15:27
回答 5查看 254关注 0票数 3

我认为这是一个古老的Javascript行为(克罗克福德说这是一个设计错误),在一个函数中,arguments就像一个数组,只是它不是一个真正的数组,所以不能在它上面调用数组方法:

代码语言:javascript
复制
function foo() { console.log(arguments.slice(1)) }   // won't work
foo(1,2,3);

我刚刚在最新的Firefox和Chrome浏览器上试用了一下,但不能同时在这两种浏览器上运行。所以我们可能不得不使用

代码语言:javascript
复制
function foo() { console.log(Array.prototype.slice.call(arguments, 1)) }
foo(1,2,3);

但是为什么不让arguments成为现代JavaScript中的一个真正的数组呢?也许不应该有任何依赖于arguments而不是实数组的程序?现在不让它成为实数组的原因可能是什么?

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

EN

回答 5

Stack Overflow用户

发布于 2012-11-02 13:30:02

直到ECMAScript 5开发的很晚,argument object才会继承所有的Array.prototype方法。但TC39于9月1日批准的ES5的“最终草案”。2009没有这个功能。

2009年8月,苹果公司的奥利弗·亨特在ES5讨论邮件列表上发布了这篇文章

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

上周五,我在WebKit中实现了使Arguments对象继承自

的逻辑,很快就出现了一个严重的

与Prototype.js不兼容...这至少破坏了许多苹果网站和Nasa.gov -- ...由于这些网站的破坏,造成了一个主要的兼容性问题

在一个相当大的图书馆中,尝试改装似乎是不可行的

参数上的类似数组的行为。

TC39的其他成员同意奥利弗的评估,并从最终草案中删除了该功能。

也许,这样的代码已经从网络上消失得足够多了,以至于提出的ES5解决方案今天可以工作。但是,这并不重要,因为ES6中的rest参数是该问题的更好解决方案,并且是一种全新的语法特性,与现有代码不会有任何向后兼容性问题。

票数 4
EN

Stack Overflow用户

发布于 2012-11-02 04:48:38

有一些在线站点依赖于arguments而不是数组,例如那些使用较旧版本的Prototype和script.aculo.us的站点。这意味着任何改变它的浏览器(ES4包含了这一点,它和在Opera9.5-10.10中使用的Futhark中的许多其他部分一起实现)都会破坏这些网站,而且市场强烈鼓励不要破坏网站(任何破坏网站的浏览器都不会被关心这些网站的用户使用,原因很明显,因为许多网站很少更新)。

票数 1
EN

Stack Overflow用户

发布于 2012-11-02 04:42:17

在ECMAScript的下一个版本中,这个问题(以及其他几个问题)将通过rest参数来解决。

代码语言:javascript
复制
function foo(...rest) {
    console.log(rest.slice(1))
}

foo(1, 2, 3);

arguments不同,rest参数将是实数组,所以这是可行的。

Rest参数可以做更多的事情。在上面的例子中,你可能想把第一个参数用在一件事情上,然后把它后面的所有参数用在其他事情上。你可以这样做:

代码语言:javascript
复制
function foo(first, ...rest) {
    console.log('first: ', first);
    console.log('rest: ', rest);
}

foo(1, 2, 3);

这将记录以下内容:

优先:1

休息时间: 2,3

建议:http://wiki.ecmascript.org/doku.php?id=harmony:rest_parameters

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13184799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档