一篇文章完全搞懂JS深淺拷貝和const

首先要了解的js基礎

基本數據類型:Object、undefined、null、Boolean、Number、String、Symbol (ES6新加) 
Object包括: Array 、Date 、RegExp 、Function

二者的重要區別在於:基本類型賦值給變量,變量的標識符和變量的值都存放在內存中的棧(Stack)裏。引用類型的變量的標識符在棧中,變量的值在內存的堆(Heap)中。
舉一個通俗的例子:基本類型是你在內存的棧中擁有一個咖啡店和鑰匙,引用類型是你只有咖啡店的鑰匙,你能夠去內存的堆中找到對應的咖啡店地址,鑰匙環上有一個標籤上面寫了,這個鑰匙是對應的哪一家店,而這個標籤就是指針。前端

圖:數據類型

bVCunf

圖:引用類型

bVCuGx

深淺拷貝問題

不知道什麼是深拷貝和淺拷貝的請先去Google並在Chrome調試臺本身操做一下,這篇文章只會說明爲什麼JS中會有這種問題。數組

我舉個栗子圖片描述spa

出現這種結果的緣由是第二步將a賦給b只是將a的地址給了b(請注意,數組是引用類型),此時改變b其實就是改變了堆中a和b共同指向的地址的值。通俗一點講:a和b兩我的都拿到了一個同一家咖啡店的鑰匙,這時候在咖啡店多放一個杯子,天然兩人共同的咖啡店都有這個杯子。因此有的時候咱們爲了不淺拷貝,會用一些方式實現深拷貝。指針

關於ES6裏的const,有些後臺人員甚至前端人員誤覺得const賦值是常量,其實調試

const並非變量的值不得改動,而是變量指向的那個內存地址所保存的數據不得改動。對於簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,所以等同於常量。但對於複合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指向實際數據的指針,const只能保證這個指針是固定的(即老是指向另外一個固定的地址)

(此段引用自阮一峯)code

const只是把鑰匙上的標籤(指針)固定,因此:
圖片描述對象

小白第一次寫技術文章,若是有錯誤還請多多指教,多謝!blog

參考資料

[深刻了解JS引用類型基本類型][5]
[阮一峯ES6教程][6]
相關文章
相關標籤/搜索