今天回答了一個(gè)關(guān)于 Javascript 的問題,涉及到了賦值問題,因此想把這個(gè)問題好好總結(jié)下。
執(zhí)行上述代碼后,變量 a 和 b 的值會(huì)發(fā)生改變嗎?
原始值和引用值
在 之前的文章中介紹過原始值和引用值,原始值指的 Undefined, Null, Boolean, Number, String 等,它們存放在棧中,而引用值則集成自 Object,它被存放在堆中。
這里要把兩者區(qū)分清楚:
以上四個(gè)變量,a 和 A 為原始值,而 b 和 B 則為引用值。
賦值機(jī)制
清楚了原始值和引用值的區(qū)別后,就可以具體介紹 Javascript 的賦值機(jī)制:
在 Javascript 中,對(duì)于原始值類型的變量,每次賦值都將生成一份拷貝,而對(duì)于引用值,則正如其名,是通過引用賦值,指向同一個(gè)存儲(chǔ)對(duì)象的內(nèi)存處。
原始值的賦值:
引用值的賦值:
參數(shù)傳遞
現(xiàn)在我們來看看傳遞兩種類型的值給函數(shù)形參時(shí)時(shí)怎么處理的。
1.傳遞原始值
輸出為1,所以我們知道函數(shù)只是將變量的值傳遞進(jìn)去了,所以在函數(shù)體內(nèi)的 m 得到傳來的值1,再被賦值為2,這個(gè)過程不影響外部的變量 a。
2.傳遞引用值
輸出為2,所以我們知道函數(shù)將變量的地址傳遞進(jìn)去了,所以函數(shù)體內(nèi)的 M 得到傳遞來的地址,因此屬性 x 被賦值為2的同時(shí)也會(huì)影響指向同一內(nèi)存地址的 A。
總結(jié)
現(xiàn)在再回到開篇的問題:
變量 a 為原始值,變量 b 為引用值,傳遞進(jìn)函數(shù)體內(nèi)一個(gè)為值,一個(gè)為地址,所以函數(shù)運(yùn)行后,變量 a 不會(huì)改變,而變量 b 的值將會(huì)改變。
新聞熱點(diǎn)
疑難解答
圖片精選