Q:const聲明的是常量,只讀,那const的值能修改嗎?
A:const保存的是指向數組或對象的指針。 const定義的是基本數據類型則不能改變,若定義的是引用數據類型,則能夠經過修改對象屬性等方法來改變。es6
棧內存:存儲 String , NUmber , Boolean , Null , Undefined , Symbol等內存有限的基本數據類型,棧內存線性有序存儲,容量小,系統分配效率高
堆內存:存儲 Object 這種引用數據類型(除基本數據類型以外),其內存大小未知,堆內存首先要在堆內存新分配存儲區域,以後又要把指針存儲到棧內存中,效率相對就要低一些。數組
所以當咱們定義一個const對象的時候,咱們說的常量實際上是指針,就是const對象對應的堆內存指向是不變的,可是堆內存中的數據自己的大小或者屬性是可變的。而對於const定義的基礎變量而言,這個值就至關於const對象的指針,是不可變。bash
注: new關鍵字初始化的存儲是在堆內存中的,由於根據構造函數生成的實例是一個對象函數
var a = new String('123')
var b = String('123')
var c = '123'
console.log(a==b, a===b, b==c, b===c, a==c, a===c)
>>> true false true true true false
複製代碼
淺拷貝,複製了對象的引用地址,兩個對象指向同一個內存地址,因此修改其中任意的值,另外一個值都會隨之變化。
如下例子,b只是複製了a的指針地址(棧內存中的值),a與b都同時指向同一個對象,因此修改數組a,數組b也跟着變了。ui
let a = [0,1,2,3,4]
let b = a
console.log( a === b )
a[0] = 1
console.log(a,b)
-------------------------------
結果:
true
[1,1,2,3,4] [1,1,2,3,4]
複製代碼
深拷貝,將對象及值複製過來,兩個對象修改其中任意的值另外一個值不會改變。spa
function deepClone (obj) {
let _obj = JSON.stringify(obj)
let objClone = JSON.parse(_obj)
return objClone
}
let a = [0,1,[2,3],4]
let b = deepClone(a)
a[0] = 1
a[2][0] = 1
console.log(a,b)
-----------------------------
結果:
[1,1,[1,3],4] [0,1,[2,3],4]
複製代碼
es6中的Object.assign()第一級屬性深拷貝,之後級別屬性淺拷貝指針
垃圾回收方面,棧內存變量基本上用完就回收了,而推內存中的變量由於存在不少不肯定的引用,只有當全部調用的變量所有銷燬以後才能回收code