【问题标题】:How does an array actually work in javascript数组如何在 JavaScript 中实际工作
【发布时间】:2014-09-05 07:53:18
【问题描述】:

我希望我的问题不是那么愚蠢。但我想知道数组在 javascript 中是如何工作的。特别是按索引获取元素。

假设我有一个名为 myFirstArray 的数组,其中包含元素 [1,2,3,4]。 当我键入 myFirstArray[3] 时,如何从该数组中获取第四个元素? 它会循环吗?所以每次我想要数组的最后一个元素时,它都会遍历整个数组?

向数组添加元素也是如此。它是否总是循环遍历数组并找到数组中的最后一个元素?

我问是因为我在 Javascript 中实现了一个linkedList,我想知道它是否比普通数组更有效。

【问题讨论】:

  • 数组实现可能是“超级优化”(但也依赖于浏览器),我认为它无法击败它。
  • 编写测试并测量它:)
  • 但链表已针对我的需要进行了超级优化。我想从数组中获取一个元素并将位置保存在一个变量中。该列表中的下一个元素应该是以下元素。所以我必须写 myFirstArray[savedPosition+1]。我想知道它是否从一开始就循环到 savedPosition+1。使用linkedList,指针指向最后一个元素,当我执行 myLinkedList.next() 时,它只会跳转到下一个元素。
  • 是的,我可以测试它。但尽管如此,我想知道数组实际上是如何工作的。 :)
  • 部分浏览器已经开源代码,欢迎学习,他们是如何实现数组的。

标签: javascript arrays linked-list


【解决方案1】:

Javascript 中数组的实现方式与大多数其他语言中的实现方式略有不同。

数组不仅仅是一个项目列表,而是一个关联数组。项目不是一个接一个地存储,而是存储为离散的键值对。例如,如果您将值放在索引 3 和 5 处,则数组不包含未定义的项目来填补空白,它只是具有已设置的值。

使用这样的代码:

var a = [];
a[3] = 1;
a[5] = 2;

存储在数组中的数据不是这样的:

[ undefined, undefined, undefined, 1, undefined, 2 ]

看起来像这样:

{
  "3": 1,
  "5": 2,
  "length": 6
}

数组中的项目作为属性存储在数组对象中,只是数组以特殊方式处理带有数字键的属性,即根据需要调整length属性。

键值集合的实现是使用哈希表完成的(或者可能更有效,取决于 Javascript 引擎),因此访问项目接近 O(1) 操作,即它没有t 遍历所有属性,直到找到正确的。

【讨论】:

    【解决方案2】:

    如何实现数组访问取决于 JavaScript 引擎本身,因此可能因引擎而异。

    我猜想在大多数引擎中数组仍然是内存块。如果您访问一个元素,则该数组不会被圈出。而是计算该特定元素的内存地址 (memory_offset_of_the_first_element + size_of_element * desired_index),然后可以从那里收集该元素。插入和删除是更复杂和昂贵的。在最坏的情况下,需要复制和调整整个数组。

    LamarWhen to use a linked list over an array/array list? 中提供了很好的概述。

    【讨论】:

      【解决方案3】:

      Javascript 中有 标准内置对象,其中一个对象是 Array。 Array 是高级全局对象,用作数组的构造函数。

      数组元素是对象属性,可以通过括号表示法访问。在其他语言中,您可以将 Javascript 数组称为 稀疏数组(例如:Wolfram)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-03
        • 2017-07-22
        • 2012-03-03
        相关资源
        最近更新 更多