JS中的棧內存和堆內存

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

相關文章
相關標籤/搜索