【问题标题】:What is the difference between an array and collection in JavaScript and when should I choose one over the other?JavaScript 中的数组和集合有什么区别,我什么时候应该选择一个而不是另一个?
【发布时间】:2017-01-23 05:15:12
【问题描述】:

我目前正在阅读 Jon Duckett 的一本书,名为“JavaScript 和 jQuery 交互式前端 Web 开发”。在关于 DOM 的章节中,它提到了

NodeLists 看起来像数组,并且像数组一样编号,但它们是 实际上不是数组。它们是一种称为集合的对象。

我的问题是,JavaScript 中的数组和集合有什么区别,我什么时候应该选择一个而不是另一个?

【问题讨论】:

  • 它们没有像集合那样明确的正式名称。有时它们以节点列表或奇异数组的形式出现。通常您不会选择使用它们,它们是作为查询的结果提供给您的。它们是类似数组的对象,具有类似索引的属性 (0,1,2,3,...) 和长度属性。它们大多也是可迭代的,但它们不能直接访问 Array.prototype。

标签: javascript arrays dom collections


【解决方案1】:

来自https://developer.mozilla.org/it/docs/Web/API/NodeList

为什么 NodeList 不是数组?

NodeList 的使用非常像数组,很容易调用 Array.prototype 方法,但是 NodeList 对象没有 任何熟悉的 Array 方法。

JavaScript 有一个基于原型的继承机制 内置对象(如数组)和宿主对象(如 NodeLists)。 数组实例继承数组方法(例如 forEach 或 map),因为 他们的原型链如下所示:

myArray --> Array.prototype --> Object.prototype --> null (The 对象的原型链可以通过调用获得 Object.getPrototypeOf 多次。)

forEach、map 等都是 Array.prototype 自己的属性 对象。

与数组不同,NodeList 原型链如下所示:

myNodeList --> NodeList.prototype --> Object.prototype --> null

NodeList.prototype 包含 item 方法,但没有 Array.prototype 方法,因此不能在 NodeLists 上使用。

【讨论】:

    【解决方案2】:

    NodeListsArray 元素集合非常相似,通常被称为 “类数组”,但有细微差别 -通过将集合保留为 NodeList,您会错过很多 JavaScript 功能,例如真正的数组迭代和原型方法。


    NodeList 接口提供了节点有序集合的抽象,而无需定义或限制该集合的实现方式。


    节点列表到数组

    var myArray = Array.prototype.slice.call(myList, 0); 不明确的 myArray.constructor.toString(); “函数数组(){ [本机代码] }"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2020-06-08
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      相关资源
      最近更新 更多