js中的數據存儲與拷貝

很無聊,很久不更新了,今天來講下拷貝問題。post

js中數據的存儲

js中有兩種數據類型,基本類型和引用數據類型,能夠看這裏js中的數據類型。 它們在內存中的存儲方式也不相同。 代碼執行,開闢新的內存空間,基本類型能夠理解爲以它的真實值的方式存儲在棧內存中。而複雜的引用類型,則會開闢塊單獨的堆內存來作數據存儲,在執行棧中存儲的只是這個堆的內存地址,就是堆的引用。ui

const a = 5
const ob = {
    a: 5,
    c: 7
}
/** 代碼執行,a存儲的值是5, 而對象 {a: 5,c: 7}則開闢了一塊堆內存進行存儲,假設堆內存地址是AAAFFF,則變量ob存儲的值就是AAAFFF **/

複製代碼

淺拷貝 && 深拷貝

在拷貝引用類型的時,假如只是簡單的賦值:spa

const ob = { a: 5, c: 7 } //假設地址時AAAFFF
const ob2 = ob //將地址AAAFFF賦予ob2

ob2.a = 8
console.log(ob) // { a: 8, c: 7 }
複製代碼

那麼只是將ob指向的地址賦予了ob2,堆內存中的a發生了改變,地址未改變,ob和ob2仍然指向AAAFFF,指向同一塊地址的兩個變量實際爲同一個。這就是淺拷貝。code

若只是基本數據類型的賦值,是直接將值賦給新變量,並不存在地址問題,原變量不受影響。咱們能夠根據這點來實現個不會受影響的深拷貝:對象

const ob = { a: 5, c: 7 }
const ob2 = {} //開闢新的與ob無關的內存空間
for(key in ob){
    ob2[key] = ob[key]
}
ob2.a = 9
console.log(ob.a) //5
console.log(ob2.a) //9
複製代碼

其餘通用深拷貝方法能夠用遞歸實現,這裏就不寫了。繼承

其餘

  • const定義常量:變量存儲的值不變。若是是引用來類型,堆內存裏發生的改變,不影響地址變更,const定義的常量爲改變
  • 說是那麼說,理解上基本類型存儲的是真實值,但js中的基本類型上仍有許多繼承下來的方法,並非單純的就只有存一個值。
相關文章
相關標籤/搜索