因为看起来人们做的第一件事就是将arguments
转换为真正的数组,所以我对Javascript语言作者和实现者为什么决定并继续认为arguments
应该这样做感兴趣不是真正的Array
。我并不是说这是火炬,我真诚地对它背后的思想感兴趣。由于函数在你身体时自然被调用,我不认为这是因为引用的对象arguments
可以改变,就像一些DOM结果一样......
答案 0 :(得分:44)
我的猜想:
arguments
对象的概念从一开始就存在于语言中,它甚至在ECMAScript First Edition Standard (PDF)中描述。
在那个版本的ECMAScript中,Array.prototype
非常基本,数组对象只包含 4种方法!:toString
,join
,{{1} }和reverse
。
我认为这是他们让sort
继承arguments
的主要原因之一,当时那些Array方法看起来并不太有用。
但是Object.prototype
对象在标准的下一个版本中进行了扩展,现在在ES5上,Array对象具有Array.prototype
,map
,reduce
,{等方法{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)
参数不只是返回参数。它返回被调用者对象和参数数组。如果它只是一个数组,那么第一个元素可能是被调用者对象并且更加混乱。