鍍金池/ 問答/HTML/ javascript 的字符串類型賦值操作是值傳遞?

javascript 的字符串類型賦值操作是值傳遞?

我構(gòu)造了一個 1 億個單元的數(shù)組,然后把一個長度 100 的字符串賦值到數(shù)組的每一項(xiàng)中,我發(fā)現(xiàn)這樣和我直接構(gòu)造一個空數(shù)組的內(nèi)存占用是一樣的。對于基礎(chǔ)數(shù)據(jù)是值傳遞的說法我現(xiàn)在大大懷疑正確性,感覺所有數(shù)據(jù)類型其實(shí)都是引用傳遞的,因?yàn)榛A(chǔ)數(shù)據(jù)類型是不可變的,拷貝他們的值除了浪費(fèi)空間,沒有任何實(shí)際意義。

var arr =[];
var str="1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
for(let i=0;i<100000000;i++){
  arr[i]=null;
}
console.log(arr.length);

內(nèi)容為空的數(shù)組,js 堆內(nèi)存占用 900M 左右
數(shù)組每項(xiàng)都賦值為 str 這個字符串,js 堆內(nèi)存占用還是 900M 左右

var arr =[];
var str="1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
for(let i=0;i<100000000;i++){
  arr[i]=str;
}
console.log(arr.length);

數(shù)組每項(xiàng)都賦值為 str 這個字符串,js 堆內(nèi)存占用還是 900M 左右
數(shù)組每項(xiàng)都賦值為 str 這個字符串,js 堆內(nèi)存占用還是 900M 左右

回答
編輯回答
離夢

在知乎上看了一個做v8引擎的大神之前寫過的一個答案,感覺和我的猜想是一致的,棧只存儲定長數(shù)據(jù),可變長度數(shù)據(jù)都是存儲在堆上的。
JavaScript字符串底層是如何實(shí)現(xiàn)的? - Thomson的回答 - 知乎

clipboard.png

還有一個關(guān)于null為啥是object的標(biāo)準(zhǔn)解釋,更加說明了這個問題,里面能看到不同數(shù)據(jù)類型的存儲方式,下面截圖是機(jī)器翻譯的,原始文章看這里

clipboard.png

2017年9月7日 00:08
編輯回答
我甘愿

如果基礎(chǔ)類型按引用傳遞,那么副本的修改會影響到原值,而JS的行為并不如此因此還是按引用傳遞

至于你實(shí)驗(yàn)的結(jié)果,我也重復(fù)了一遍,結(jié)論和你的一樣。因此我猜想這里是引擎做了優(yōu)化,如果不改變值類型變量的副本,那么傳遞的是引用。如果有改變,則按值傳遞再修改。這只是我的猜想,同時與JS的傳參行為并不沖突

2018年4月20日 02:34