是否有一个原因,nodeList和参数不是实际的数组?

时间:2014-12-05 04:38:33

标签: javascript

nodeListarguments只是“阵列式”有什么好处?

2 个答案:

答案 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等功能,可以缓解一些痛苦。