Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript(或NodeJS)如何处理内存分配?_Javascript_Node.js_Memory_Memory Management_V8 - Fatal编程技术网

JavaScript(或NodeJS)如何处理内存分配?

JavaScript(或NodeJS)如何处理内存分配?,javascript,node.js,memory,memory-management,v8,Javascript,Node.js,Memory,Memory Management,V8,假设是V8上下文 假设Number类型的元素大小为4字节 现在,如果我有一个数组 let a = [1,2,3,4,5]; 从逻辑上讲,每个元素的块的起始地址应该是10001004100810121016 现在,假设我们有一个字符串TestString,它需要10个字节,我需要: a[2] = 'TestString'; 使数组变成[1,2,'TestString',4,5] JS如何处理TestString的内存分配和管理数组中块的地址空间?JavaScript中的数组实际上只是一种特殊类

假设是V8上下文

假设
Number
类型的元素大小为4字节

现在,如果我有一个数组

let a = [1,2,3,4,5];
从逻辑上讲,每个元素的块的起始地址应该是10001004100810121016

现在,假设我们有一个字符串
TestString
,它需要10个字节,我需要:

a[2] = 'TestString';
使数组变成
[1,2,'TestString',4,5]


JS如何处理
TestString
的内存分配和管理数组中块的地址空间?

JavaScript中的数组实际上只是一种特殊类型的对象。因此,数组的“索引”实际上只是存储整数值的属性,而存储的数据只是指向已分配内存块的指针——非常类似于链表

这就是为什么可以在现有阵列上使用push或pop等阵列方法,而无需重新分配为阵列预留的内存块

我不知道V8正在做什么的确切细节,但我要假设,由于JavaScript具有松散/动态类型的特性,它可能不像您在示例中使用的那样连续分配内存——对于这样一种弱的动态类型语言,它有太多潜在的缺点

JavaScript基本上使一切成为一个对象。数组是一个对象,数组的索引值,只是指向对象的指针。这就是为什么每个数据类型都是一个变量,可以访问属性和方法

实际上,以下地址空间:

let a = [1, 2, 3, 4, 5];
将是指向已分配内存块的指针,如548995、48885、3889282、093838、7883344。或者类似的。当您重新分配它们中的任何一个时,JavaScript将在堆中找到一个内存块,并将数组索引值设置为已分配块的指针

编辑:@CookSkooma@Onsl4ught@Phinal,那个么你们这些堕落的人做什么呢?在一家狗屎公司工作,因为失败者的队伍会退化,会激怒那些冒犯你温柔的SJW情感的人?我从来没有点燃过火焰,管好自己的事,保护自己,而你却亲自攻击我。业力来了。

阵法不一定是阵法。V8为此使用了各种内部表示。