深拷貝與淺拷貝

CPU緩存 (Cache Memory)

  • CPU緩存中存放了CPU短時間內(nèi)需要訪問的數(shù)據(jù),從而加快運算速度.
  • CPU運算先讀緩存后讀內(nèi)存.緩存的數(shù)據(jù)由內(nèi)存塊推入緩存.

一級緩存/二級緩存

  • 一級緩存存放了數(shù)據(jù)緩存(Data Cache)和指令緩存(Instruction Cache)
  • 二級緩存一般存放了一級緩存放不下的內(nèi)存塊內(nèi)容.(不包含指令緩存)
  • 緩存的使用率逐級遞減,所以讀寫性能也是逐級遞減,同理容量逐級遞增但是造價逐級遞減.
    這個和內(nèi)存硬盤的關(guān)系很像.

堆(stack)和棧(heap)

  • 內(nèi)存棧區(qū):由編譯器自動分配釋放. 先進(jìn)后出(FILO).
  • 內(nèi)存堆區(qū):一般由程序員分配釋放(JS由編譯器控制). 先進(jìn)先出(FIFO).
  • 內(nèi)存棧推入一級緩存, 內(nèi)存堆推入二級緩存.

JavaScript的基本類型和引用類型

  • 基本類型存放在棧中.因為編譯器知道基本類型需要多大的內(nèi)存空間.
  • 引用類型較為復(fù)雜而且不定使用空間,所以放入內(nèi)存堆中,使用較為自由.
  • 定義一個引用類型的變量時, 變量實體放入內(nèi)存堆中, 變量名對應(yīng)一個內(nèi)存堆的地址,這個地址放在內(nèi)存棧中.

JavaScript深拷貝和淺拷貝

  • 該說法適用于引用類型數(shù)據(jù)的拷貝.
實際上obj2只在棧內(nèi)存上復(fù)制了,即obj2這個變量名對應(yīng)的是和obj1相同的堆內(nèi)存的地址, 因此obj1和obj2同時指向一個堆內(nèi)存即實際對象. 這種拷貝叫做淺拷貝.
> * 在實際使用過程中, 一般強(qiáng)調(diào)一個非突變的概念(immutable),即不直接修改原對象,而是用一個新的對象去替換它. 所以深拷貝是有意義的即開辟一個新的堆內(nèi)存空間.

# 數(shù)組的深拷貝
> * 簡單數(shù)組的拷貝:
``` var arr1 = [1,2,3];
var arr2 = arr1.slice(0);   
var arr3 = arr1.concat();
arr1[0] = [5]; 
arr1;  // [5,2,3]
arr2;  // [1,2,3]
arr3;  // [1,2,3]
  • 數(shù)組中包含子數(shù)組,和上述方法相同.
  • 數(shù)組中包含對象:
var arr2 = JSON.parse( (JSON.stringify(arr1) );
arr1[0] = {d:5};
arr1;  // [ {d:5} , {b:2,c:3} ]
arr2;  // [ {a:1} , {b:2,c:3} ];```

# 對象的深拷貝
> * 簡單對象的拷貝:
ES6下有函數(shù)Object.assign();
```var obj1 = { a:1 , b:2 , c:3};
var obj2 =Object.assign({},obj1);

當(dāng)然這個函數(shù)還有很多其他的特點, 詳見https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

  • 當(dāng)然最簡單的還是JSON得方法了,不過就是包含了方法就不能拷貝了.
var obj2 = JSON.parse( JSON.stringify(obj1) );

參考文獻(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容