数组如何在javascript中实际工作

时间:2014-09-05 07:53:19

标签: javascript arrays linked-list

我希望我的问题不是那么愚蠢。但是我想知道数组如何在javascript中实际运行。通过索引特意获取元素。

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

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

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

3 个答案:

答案 0 :(得分:3)

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循环遍历所有属性,直到找到正确的属性。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

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