数组在javascript中是如何实际工作的



我希望我的问题没有那么愚蠢。但我一直想知道数组在javascript中到底是如何工作的。特别是通过索引获取元素。

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

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

我之所以这么问,是因为我在Javascript中实现了linkedList,我想知道它是否比普通数组更高效。

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)操作,即在找到正确的属性之前,它不会遍历所有属性。

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

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

Lamar在"何时在数组/数组列表上使用链表?"中提供了一个很好的概述?。

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

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

相关内容

  • 没有找到相关文章

最新更新