【问题标题】:What data structure are arrays implemented with in JavaScript?JavaScript 中的数组是用什么数据结构实现的?
【发布时间】:2019-12-03 04:13:28
【问题描述】:

我们正在学习计算机科学中的数组以及它们如何占用连续范围的内存空间。

在纯数组中,您不能在不移动其他元素的情况下添加和删除元素。

所以当我这样做时:

const arr = ['a', 'b', 'd'];

arr.splice(2, 0, 'c'); // arr is now ['a', 'b', 'c', 'd']

我没有执行数组操作,数组必须在 JavaScript 中以其他方式实现?

也许是一个链表?

我不是要求规范,只是在浏览器或 Node 中的语言的典型实现中,它们可能使用什么?

10 year old+ Q/A 涉及主题但未回答,请勿标记为重复。

实际的底层表示可能因浏览器(或 它可能不会)。

最可能使用的底层数据结构是什么?

【问题讨论】:

  • 澄清一下——您想知道 JavaScript 从浏览器的角度存储数组的方式吗?如果我错了或离题,请澄清:)
  • 将 Q 更新为 the browser or Node ...
  • 据我了解...... JavaScript 无法真正“了解”数组的“实时”结构。它基于运行时环境做出假设,但它永远无法真正“知道”数组对象的确切结构。这只是我的理解,这就是为什么我要发表评论而不是答案;)

标签: javascript arrays


【解决方案1】:

数组不仅仅以一种方式实现。这取决于您输入的内容、数字、其他数组或对象等。

JavaScript 引擎然后在运行时决定如何实现它。

最常见的两种是 C++ 数组和链表。

更多信息请参见here

【讨论】:

  • 其实大部分 js 引擎从不使用链表。他们改用哈希表(因为他们已经有了处理对象的代码并使数组访问 O(1))。 V8 是一个使用数组或哈希表而不使用链表的示例
  • 我的参考是您在上面提供的链接参考。它说它使用数组或数组或数组或数组或数组或数组或字典(哈希表)。请参阅“C++ here”链接后的案例列表。所以在任何情况下 V8 都不使用链接列表
  • 这部分:PACKED_SMI_ELEMENTS – a packed integer arrayPACKED_DOUBLE_ELEMENTS – a packed double arrayPACKED_ELEMENTS – a packed object arrayHOLEY_SMI_ELEMENTS – a sparse integer arrayHOLEY_DOUBLE_ELEMENTS – a sparse double arrayHOLEY_ELEMENTS – a sparse object arrayDICTIONARY_ELEMENTS – a very sparse array that is backed by a dictionary (which is a hash table)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 2011-05-12
相关资源
最近更新 更多