JS中簡單數據類型和復雜數據類型在內存中的存儲和引用


JS中的簡單數據類型有 number, string, bool, undefined和null, 先來介紹一下簡單數據類型在內存中是如何存儲的

當我們聲明一個變量a的時候, 會在棧里面開辟出一塊新的內存空間, 用來存放這個變量a的數值, 當這個變量a存儲的數值發生改變時, 棧空間里的對應那塊內存里的數據也會發生改變, 此時如果又聲明了一個變量b, 並把變量a賦值給變量b時, 在棧里面又會新開辟出一塊空間, 用來存放變量b存儲的數值, 而這個數值, 是變量a傳遞給他的, 因此, 此時兩個變量分別對應兩塊內存空間, 存儲的值是相同的, 因此, 當變量a發生改變時, 並不會影響到變量b所擁有的那塊內存空間, 所以變量b是不會改變的

var a = 0
var b = a
a = 1
console.log(b)   //0

JS中除了上述所說的簡單數據類型, 其他都是復雜數據類型, 復雜數據類型在聲明之后, 會在堆內存中開辟出一塊空間, 用來存放數據, 拿對象舉例, 在我們新建一個對象之后, 會在堆內存中開辟一塊空間, 用來存放對象里的數據, 而復雜數據類型跟簡單數據類型的不同點就是在於, 簡單數據類型的變量指向的是內存中的數據, 而復雜數據類型指向的是其在內存中的地址,通過這個地址, 從而拿到地址中的數據, 因此, 如果將一個對象賦值給另一個對象的時候, 其實是把這個對象在內存空間中的地址傳遞給了另一個對象, 此時, 他們共享內存中的同一塊空間以及空間里的數據, 如果對其中一個對象的一個屬性進行修改的話, 那么因為兩個對象是共享一塊地址一個數據的, 因此另一個對象中的屬性也會被改變. 如果對其中一個對象重新賦值的話, 那么這個對象就會指向另一塊內存空間, 就不在與另一個對象共享同一塊內存了

var obj_one = {
  name: 'zhangsan'
}
var obj_two = obj_one
obj_one.name = 'lisi'
console.log(obj_two.name)  //lisi

//對obj_one進行重新賦值
obj_one = {
  name: 'wangwu'
}
console.log(obj_two.name)  //lisi

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM