JavaScript 中“数组”是如何实现的?

jen*_*fer 2 javascript v8 data-structures

我宽松地使用这个术语,因为 JavaScript 中的数组可以如下所示:

let array = [1, 'a', "hello"];
Run Code Online (Sandbox Code Playgroud)

如果我这样做array.push('end')我得到

[1, 'a', "hello", "end"]
Run Code Online (Sandbox Code Playgroud)

JavaScript 中的数组似乎与计算机科学中教授的数组无关,因为所有项目都属于同一类型,这使得通过索引访问变得很容易,因为可以使用简单的数学来确定每个索引在内存中的位置。

我的假设是一个单链表,其中数据是对另一个对象的引用。

如果有人知道 V8 引擎的代码在哪里,那么看到代码就很酷了。

Jon*_*lms 8

V8 的源代码可以在这里找到。目前V8通过两种方式实现数组:

 // The JSArray describes JavaScript Arrays
 // Such an array can be in one of two modes:
 //    - fast, backing storage is a FixedArray and length <= elements.length();
 //       Please note: push and pop can be used to grow and shrink the array.
 //    - slow, backing storage is a HashTable with numbers as keys.
Run Code Online (Sandbox Code Playgroud)

因此数组目前被实现为哈希表或数组列表。这在过去已经改变,并且在未来也可能改变。对于其他发动机,它也可能有所不同。