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

时间:2010-07-14 00:10:10

标签: javascript function arrays arguments

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

4 个答案:

答案 0 :(得分:44)

我的猜想:

arguments对象的概念从一开始就存在于语言中,它甚至在ECMAScript First Edition Standard (PDF)中描述。

在那个版本的ECMAScript中,Array.prototype非常基本,数组对象只包含 4种方法!toStringjoin,{{1} }和reverse

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

但是Object.prototype对象在标准的下一个版本中进行了扩展,现在在ES5上,Array对象具有Array.prototypemapreduce,{等方法{1}}等非常强大的

去年,ES5中有一项提案要求every在标准的草稿阶段继承some,但之后会被删除。

在这些草稿中,arguments继承自Array.prototype,但为了向后兼容ES3,arguments对象定义了两个自己的属性,Array.prototype和{{1}两者都指向arguments上的相同方法,但最后,委员会决定继续继承toString

答案 1 :(得分:27)

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
}

我总觉得这种“神奇行为”是arguments不是数组的原因。

答案 2 :(得分:5)

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

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

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

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

答案 3 :(得分:3)

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