gpt4 book ai didi

javascript - JavaScript数组是如何存储在内存中的

转载 作者:数据小太阳 更新时间:2023-10-29 06:14:18 24 4
gpt4 key购买 nike

所以,我在想数组在 JavaScript 中是如何存储在内存中的。

我已经阅读了 How are JavaScript arrays represented in physical memory? ,但我找不到答案。

我更多的是考虑数组单元的内存位置。例如在 C 中,您需要在定义数组时定义数组的大小。有了这个,C定义了一整 block 内存,它可以查看每个单元的确切位置。

例如:

int array[10]; // C knows the memory location of the 1st item of the array

array[3] = 1 // C can do that, because it can calculate the location
// of array[3] by doing &array + 3 * (int size)

在 JS 中,您可以在将内存分配给其他内容后增加数组的大小,这意味着 JS 不适用于“ block ”类型的数组。

但是如果数组不是单 block 内存,那么JS怎么计算每个单元在哪呢? JS数组是否遵循链表类型的结构?

最佳答案

我要向大家推荐的一件事是,node.js 最近成为了 Chrome V8 的一等公民,所以我建议学习 V8,不仅要了解它如何处理这些实现细节,还要了解原因。

首先,本文应该证明对读者有益,因为它专注于编写优化的同构 JavaScript:

https://blog.sessionstack.com/how-javascript-works-inside-the-v8-engine-5-tips-on-how-to-write-optimized-code-ac089e62b12e

以上文章详细介绍了 JIT(即时)编译器的工作原理,因此您应该能够在阅读后准确地推导出您的问题。

摘录如下:

Arrays: avoid sparse arrays where keys are not incremental numbers. Sparse arrays which don’t have every element inside them are a hash table. Elements in such arrays are more expensive to access. Also, try to avoid pre-allocating large arrays. It’s better to grow as you go. Finally, don’t delete elements in arrays. It makes the keys sparse.

其次,我还建议阅读这篇文章,然后再深入了解 V8: http://www.jayconrod.com/posts/52/a-tour-of-v8-object-representation

第三,作为一个重要的奖励事实,我不久前阅读了这个答案,我时不时地在脑海中重新审视它。我非常惊讶我现在才发现它。我从字面上搜索了“堆栈溢出优化火车轨道”并找到了它。感谢谷歌:Why is it faster to process a sorted array than an unsorted array?

是的,这个答案确实有 27,000 张赞成票。

那篇文章讨论了分支预测,我希望您能意识到这一点,因为它可能会对您处理数据的方式产生一些影响,而不仅仅是数组。再次注意我链接的第一篇文章,并注意它描述的对象键的顺序

可以通过了解实现细节并了解问题为何以这种方式解决来优化性能。

最后,在 JavaScript 中一切都是对象,除非它是标量值,我们称之为原语——字符串、数字、 bool 值等。

为了发人深省,这里有一个例子:

const arr = ['one', 'two', 'three']

const sameArr = {
0: 'one',
1: 'two',
2: 'three',
}

然后我们可以像解构对象一样解构我们的数组:

const yolo = ['one', 'two', 'three']

const {
0: one,
1: two,
2: three,
} = yolo

console.log('Pretty cool:', one, two, three)

您可以从该示例中得到一些提示,说明为什么更改键的顺序会对底层哈希表造成严重破坏。仅仅因为您看不到键并不意味着它们不存在并且不受影响。

在上面的例子中,如果它是一张 map ,你可以执行 sameArr.get('0') 并且 JavaScript 会合理地知道它在数字表中的确切位置。

由于 ES6 的大修,我还建议仔细阅读旧的 JavaScript Material 。将您引导至 V8 Material ,我觉得最舒服。

关于javascript - JavaScript数组是如何存储在内存中的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49990761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com