因为似乎人们做的第一件事就是将arguments
转换为真正的数组,所以我很想知道JavaScript语言作者和实现者为什么决定并继续认为arguments
不应该成为一个真正的Array
。我并不是说这是挑衅,我真诚地对此背后的思考感兴趣。由于该函数在其主体内部自然被调用,我认为这并不是因为对象 arguments
正在引用的内容可能会更改,就像某些DOM结果一样...
因为似乎人们做的第一件事就是将arguments
转换为真正的数组,所以我很想知道JavaScript语言作者和实现者为什么决定并继续认为arguments
不应该成为一个真正的Array
。我并不是说这是挑衅,我真诚地对此背后的思考感兴趣。由于该函数在其主体内部自然被调用,我认为这并不是因为对象 arguments
正在引用的内容可能会更改,就像某些DOM结果一样...
我的猜测:
arguments
对象的概念从语言一开始就存在了,甚至在 ECMAScript 第一版标准(PDF) 中都有描述。
在那个版本的 ECMAScript 中,Array.prototype
很基本,数组对象只包含 4 个方法!:toString
、join
、reverse
和 sort
。
我认为这是它们让 arguments
继承自 Object.prototype
的主要原因之一,当时这些数组方法看起来并不太 有用。
但是在标准的下一个版本中,Array.prototype
对象得到了扩展,现在在 ES5 中,数组对象具有诸如 map
、reduce
、every
、some
等 非常强大的 方法。
去年,ES5 中有一个提议,让 arguments
继承自 Array.prototype
,在标准的草案阶段,但后来被放弃了。
在那些草案中,arguments
继承自 Array.prototype
,但为了向后兼容 ES3,arguments
对象定义了两个自有属性,toString
和 toLocaleString
,都指向 Object.prototype
上的相同方法,但最终委员会决定继续从 Object.prototype
继承。
Object.prototype
。也许将来会有所改变... - Christian C. SalvadóArray.prototype
进行发布。 - gsneddersarguments对象有一个非常不寻常的特点,即其类似数组的元素是函数参数的本地变量的同义词。例如:
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
不是数组的原因。
function a() { console.log(arguments) }; a(1, 2, 3);
... - pr1001arguments
没有被实现为数组的原因吗? - Daniel Vassalloarguments
对象本身是可以改变的(无论严格模式下的各种语义限制如何)。唯一的变化是它的 [[Class]]
内部属性包含字符串 "Arguments"
,例如:Object.prototype.toString.call(arguments) == "[object Arguments]";
。 - Christian C. Salvadóarguments
只是一个对象,虽然我们无法在技术上更改实际的参数,但我们可以通过数组索引 - arguments [0]
、arguments [1]
等来对整个 arguments
对象或其表示的各个参数进行任何操作。为什么它不是一个 Array
,或者给定一个类似数组的接口仍然值得考虑。同样的问题也适用于 NodeList。 - Anuragarguments
可以充分利用它。我能想到的一个关于基本接口的原因是,ES5委员会在进行重大更改时基本上负责整个Web,所以不幸的是变化缓慢且困难。 - Anuragarguments不仅仅返回参数。它还会返回调用对象以及参数数组。如果只返回一个数组,第一个元素可能是调用对象,从而更加混淆不清。