nodeList
和arguments
只是“阵列式”有什么好处?
答案 0 :(得分:1)
在每种情况下,对象都有一些实际数组不能拥有的行为。
在NodeList
的情况下,某些节点列表是" live"集合,意味着即使在创建之后,它们仍然会反映对底层DOM的后续更改。 (例如,如果node
是一个节点,则node.childNodes
是一个始终包含其当前子节点的节点列表。)
在arguments
的情况下,当您为其元素分配时,它实际上会分配给相应的局部变量。例如,无论传递什么参数,此函数始终返回3
:
function returnThree(i) {
arguments[0] = 3;
return i;
}
(您甚至可以将arguments
作为参数传递给另一个函数,并让它分配给您的局部变量!)
(注意:这些行为是否实际上是"优势"可能是一个争论的问题。)
答案 1 :(得分:1)
arguments
不是真正的数组是历史文物。虽然如另一个答案中所指出的那样,它具有callee
属性,并且可以代理到实际的参数中,而这些参数本身并不会阻止它成为真正的数组。有关更多讨论,请参阅Why isn't a function's arguments object an array in Javascript?。值得指出的是toString
上的arguments
方法与数组的行为不同。
NodeList
不是JS本身的一部分;它是一个DOM数据接口定义,旨在从许多语言和环境中使用。如果它是JS实现中的一个数组,那么人们可能希望它是一个从Array子类化的类型,但是JS不支持很好地子类化Array。此外,在这种情况下,我们会有一个稍微奇怪的DOM数据类型的情况,它在JS中不同(扩展)指定数据接口的定义。正如其他答案中所指出的那样,NodeList
可能是"生活",但同样,这本身并不会阻止它成为真正的数组。
ES6提供Array.from
等功能,可以缓解一些痛苦。