【问题标题】:How is an "array" implemented in JavaScript? [duplicate]JavaScript 中如何实现“数组”? [复制]
【发布时间】:2020-08-25 05:44:40
【问题描述】:

我使用这个术语很松散,因为 JavaScript 中的数组可能看起来像这样:

let array = [1, 'a', "hello"];

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

[1, 'a', "hello", "end"]

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

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

如果有人知道 V8 引擎的代码在哪里,那会很酷。

【问题讨论】:

  • 每种语言都有不同的数据类型实现。这就是它的设计方式。
  • 好吧,javascript 是一种弱类型语言,当然你可以有混合类型的数组。如果您想要强类型的东西,请查看 typescript。不要将 javascript 数组称为“不正确”的数组。它们是数组。数组是实现可迭代接口的简单容器,因此可以有各种类型的数组,javascript 是数字关联的任何 [] 类型数组。
  • @r3wt "术语数组通常用于表示数组数据类型,一种由大多数高级编程语言提供的数据类型,由一组值或变量组成,可以通过以下方式选择一个或多个在运行时计算的索引。数组类型通常由数组结构实现;然而,在某些语言中,它们可能由哈希表、链表、搜索树或其他数据结构实现。 TLDR:OP 是正确的,如果我们谈论 array data structures
  • "我的假设是一个单链表" - 这个假设基于什么?不,js Array 数据结构在其他语言中是所谓的“可变大小数组”、“向量”或双端队列,通常是这样实现的。

标签: javascript data-structures v8


【解决方案1】:

可以在here 找到 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.

所以数组目前被实现为哈希表或数组列表。这在过去发生了变化,并且将来可能会发生变化。其他引擎也可能有所不同。

【讨论】:

  • 很好的参考。那是我在.h 文件中看到的 C 编程语言吗?
  • @j.a. C++,是的...
猜你喜欢
  • 2020-11-01
  • 2012-01-07
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
相关资源
最近更新 更多