我希望我的问题不是那么愚蠢。但是我想知道数组如何在javascript中实际运行。通过索引特意获取元素。
假设我有一个名为myFirstArray的数组,其元素为[1,2,3,4]。 当我输入myFirstArray [3]时,如何从该数组中获取第四个元素? 它循环了吗?所以,每当我想要数组的最后一个元素时,它就会循环遍历整个数组?
向Array添加元素也是如此。它总是通过数组循环找到数组中的最后一个元素吗?
我问,因为我在Javascript中实现了一个linkList,我想知道它是否比普通数组更有效。
答案 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
),然后可以从那里收集该元素。插入和删除更复杂,更昂贵。在最坏的情况下,需要复制和调整整个阵列。
Lamar在When to use a linked list over an array/array list?中提供了一个很好的概述。
答案 2 :(得分:1)