在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

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

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

內容為空的數組,js 堆內存占用 900M 左右
數組每項都賦值為 str 這個字符串,js 堆內存占用還是 900M 左右

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

數組每項都賦值為 str 這個字符串,js 堆內存占用還是 900M 左右
數組每項都賦值為 str 這個字符串,js 堆內存占用還是 900M 左右

回答
編輯回答
離夢

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

clipboard.png

還有一個關于null為啥是object的標準解釋,更加說明了這個問題,里面能看到不同數據類型的存儲方式,下面截圖是機器翻譯的,原始文章看這里

clipboard.png

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

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

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

2018年4月20日 02:34