鍍金池/ 問答/Linux  HTML/ 為什么 JavaScript 可能會不分配內(nèi)存?

為什么 JavaScript 可能會不分配內(nèi)存?

MDN 的內(nèi)存管理上的例子提到,JavaScript 可能決定不分配內(nèi)存,不知道怎么理解:

var s = "azerty";
var s2 = s.substr(0, 3); // s2 是一個(gè)新的字符串
// 因?yàn)樽址遣蛔兞浚?// JavaScript 可能決定不分配內(nèi)存,
// 只是存儲了 [0-3] 的范圍。

var a = ["ouais ouais", "nan nan"];
var a2 = ["generation", "nan nan"];
var a3 = a.concat(a2); 
// 新數(shù)組有四個(gè)元素,是 a 連接 a2 的結(jié)果

意思是不給變量 s2 分配內(nèi)存嗎?只是存儲 [0-3] 范圍是怎么存儲的?

回答
編輯回答
哎呦喂

substr 這個(gè)方法是定義在 String.prototype 上面的,s 作為一個(gè)字符串在執(zhí)行 substr 的時(shí)候,已經(jīng)執(zhí)行了一次 new String(s)。正常情況下 s2 也應(yīng)該是保存在內(nèi)存中,那么【可能】這種時(shí)候是否是以對象的形式去保存 s2,也就是指保存[0-3]的范圍?

2018年7月17日 10:51
編輯回答
心上人

查了一些資料,大概了解其中的原理。

var s = "azerty";
var s2 = s.substr(0, 3);

例子中 s 和 s2 都是基本數(shù)據(jù)類型,是存放在棧內(nèi)存中的,而棧內(nèi)存有個(gè)特點(diǎn)就是數(shù)據(jù)共享。

JavaScript 首先會在棧中創(chuàng)建一個(gè)變量為 s 引用,然后查找棧中是否有 azerty 這個(gè)值,如果沒有找到,就將 azerty 存放進(jìn)來,然后將 s 指向 azerty。

接著創(chuàng)建一個(gè)變量為 s2 引用,查找棧中是否有 aze 這個(gè)值,因?yàn)榇藭r(shí)棧中已經(jīng)存在了 azerty,所以例子才會說“JavaScript 可能決定不分配內(nèi)存”,s2 只是指向了 azerty 的 [0-3] 的范圍,也就是 s 和 s2 共享 azerty。

基于此,JavaScript 會創(chuàng)建一個(gè)變量 s2,但不會再分配一個(gè)內(nèi)存存放它的值 aze,而是讓 s2 指向棧中現(xiàn)有的 azerty 的 0-3 范圍。

JavaScript中內(nèi)存使用規(guī)則--堆和棧
2017年10月25日 18:48