为什么函数的参数不是Javascript中的数组?

pr1*_*001 50 javascript arrays arguments function

因为它看起来像人做的是转换的第一件事arguments变成一个真正的数组,我感兴趣的是,为什么Javascript语言的作者和实施者决定,并继续认为,这arguments应该不是一个真正的Array.我并不是说这是火炬,我真诚地对它背后的思想感兴趣.由于函数在你身体时自然被调用,我不认为这是因为arguments引用的对象可以改变,就像一些DOM结果一样......

CMS*_*CMS 44

我的猜想:

arguments对象的概念从一开始就一直在语言上,甚至在ECMAScript第一版标准(PDF)中也有描述.

在那个版本的ECMAScript中,这Array.prototype是非常基本的,数组对象包含4个方法!:toString,join,reversesort.

我认为这是他们arguments继承的主要原因之一Object.prototype,那时候那些Array方法看起来并不太有用.

Array.prototype对象是在标准的下一个版本的扩展,现在ES5,Array对象有方法,例如map,reduce,every,some,等等,这是真的很强大.

去年,在标准草案的草案阶段,ES5中有一项建议arguments继承Array.prototype,但后来被撤销.

在这些草案中,arguments继承自Array.prototype,但为了向后兼容ES3,该arguments对象定义了两个自己的属性,toString并且toLocaleString都指向相同的方法Object.prototype,但最后,委员会决定继续继承Object.prototype.

  • 推测?看起来你出现在所有委员会会议中..哈哈 (14认同)
  • 谁在那里不知道它:http://www.slideshare.net/douglascrockford/newandimproved,很好的总结btw +1.但是它没有告诉你**为什么**委员会"**继续**认为'论点`不应该是真正的'数组'" (5认同)
  • @galambalazs:IMO理由为什么委员会决定,它是关于*打破网络*的恐惧,ES5标准是非常谨慎地设计的,避免任何根本性的改变,实际上没有为该语言引入新的语法.我谈到的提议,IIRC被淘汰了,因为他们讨论了*极端边缘*不兼容的情况,例如重新定义`Object.prototype`.我们会看到,也许将来...... (2认同)

Dan*_*llo 28

arguments对象具有非常不寻常的特性,它的类数组元素是包含函数参数的局部变量的同义词.例如:

function f(x) {
   console.log(arguments[0]);   // Displays the initial value of the argument x
   x = 5;                       // Changes the value of the local variable x
   console.log(arguments[0]);   // Now displays 5
}
Run Code Online (Sandbox Code Playgroud)

我总觉得这种"神奇的行为" arguments是不是阵列的原因.

  • 幸运的是,这个*链接*已经在ES5严格模式下删除了:)(我不喜欢魔术!). (8认同)

Rex*_*x M 5

重要的是要注意,如果没有设计师出现,我们只能猜测为什么.但我们可以提出一些正当理由......这是我的:

从函数的角度来看,一个原因可能是因为你不能 - 显然 - 实际上改变传递给你的参数.您可以更改一个表示传递给您的参数的数组,但是在您收到执行范围之前,传递的参数是一成不变的.

你可以拼接,骰子和弹出数组,如果你对arguments对象做了那么你只是毁了概念上是一个不可变的结构(悲伤的脸!).真正的参数对象的设计更接近于JavaScript可以提供的一种不变性.

它类似于查询字符串参数.您将收到发送请求的客户收集的集合.它是请求信息的一部分,已经设置完成.

  • 我不确定我是否完全同意这里的推理.`arguments`只是一个对象,虽然我们不能在技术上改变实际的参数,但我们可以对整个`arguments`对象或它通过数组索引表示的单个参数做任何我们想做的事情 - `arguments [0]`,` arguments [1]`,...为什么它不是一个`Array`那么,或者给出一个类似数组的接口仍然值得考虑我会说.同样的问题适用于NodeList. (4认同)