为什么不是一个函数的参数对象在Javascript中的数组?

由于人们所做的第一件事情就是将arguments转换为真实的数组,所以我对Javascript语言作者和实现者为什么决定并继续认为arguments 应该是真正的Array感兴趣。 我不是说这个是鱼眼,我真的对它背后的想法感兴趣。 由于该函数自然被调用时,我不认为这是因为对象arguments引用可以改变,像一些DOM结果…

我的猜想:

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

在该版本的ECMAScript中, Array.prototype非常基本,数组对象包含4个方法!toStringjoinreversesort

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

但是Array.prototype对象在标准的下一个版本中得到了扩展,现在在ES5上,Array对象具有如mapreduceeverysome强大的方法

去年,ES5中有一个build议是在标准草案阶段从Array.prototypeinheritancearguments ,但后来又被放弃了。

在这些草案中,从Array.prototypeinheritance的arguments ,但为了向后兼容ES3, arguments对象已经定义了两个自己的属性toStringtoLocaleString ,它们都指向Object.prototype上的相同方法,但最后,委员会决定保留从Object.prototypeinheritance。

参数对象具有非常不寻常的特征,即它的数组元素是包含函数参数的局部variables的同义词。 例如:

 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 } 

我总觉得这个“神奇的行为”是arguments不是arrays的原因。

重要的是要注意,没有一位devise师在场,我们只能真正猜测为什么 。 但我们可以拿出一些体面的理由…这是我的:

从function的angular度来看,一个原因可能是因为你显然不能改变传递给你的论点。 你可以改变一个代表传入你的参数的数组,但是在你接收到执行范围之前,传入的参数会被设置为石头。

你可以拼接,骰子和popup数组,如果你这样做的arguments对象,那么你只是破坏了什么概念上是一个不可改变的结构( 悲伤的脸! )。 真实的参数对象的devise更接近于JavaScript提供的一种不变性。

它类似于查询string参数。 发送请求的客户会收到一个收集。 这是已经设置和完成的请求信息的一部分。

参数不只是返回参数。 它返回被调用对象和参数数组。 如果它只是一个数组,第一个元素可能是被调用对象,会更混乱。