CPU緩存 (Cache Memory)
- CPU緩存中存放了CPU短時(shí)間內(nèi)需要訪問(wèn)的數(shù)據(jù),從而加快運(yùn)算速度.
- CPU運(yùn)算先讀緩存后讀內(nèi)存.緩存的數(shù)據(jù)由內(nèi)存塊推入緩存.
一級(jí)緩存/二級(jí)緩存
- 一級(jí)緩存存放了數(shù)據(jù)緩存(Data Cache)和指令緩存(Instruction Cache)
- 二級(jí)緩存一般存放了一級(jí)緩存放不下的內(nèi)存塊內(nèi)容.(不包含指令緩存)
- 緩存的使用率逐級(jí)遞減,所以讀寫(xiě)性能也是逐級(jí)遞減,同理容量逐級(jí)遞增但是造價(jià)逐級(jí)遞減.
這個(gè)和內(nèi)存硬盤(pán)的關(guān)系很像.
堆(stack)和棧(heap)
- 內(nèi)存棧區(qū):由編譯器自動(dòng)分配釋放. 先進(jìn)后出(FILO).
- 內(nèi)存堆區(qū):一般由程序員分配釋放(JS由編譯器控制). 先進(jìn)先出(FIFO).
- 內(nèi)存棧推入一級(jí)緩存, 內(nèi)存堆推入二級(jí)緩存.
JavaScript的基本類型和引用類型
- 基本類型存放在棧中.因?yàn)榫幾g器知道基本類型需要多大的內(nèi)存空間.
- 引用類型較為復(fù)雜而且不定使用空間,所以放入內(nèi)存堆中,使用較為自由.
- 定義一個(gè)引用類型的變量時(shí), 變量實(shí)體放入內(nèi)存堆中, 變量名對(duì)應(yīng)一個(gè)內(nèi)存堆的地址,這個(gè)地址放在內(nèi)存棧中.
JavaScript深拷貝和淺拷貝
- 該說(shuō)法適用于引用類型數(shù)據(jù)的拷貝.
實(shí)際上obj2只在棧內(nèi)存上復(fù)制了,即obj2這個(gè)變量名對(duì)應(yīng)的是和obj1相同的堆內(nèi)存的地址, 因此obj1和obj2同時(shí)指向一個(gè)堆內(nèi)存即實(shí)際對(duì)象. 這種拷貝叫做淺拷貝.
> * 在實(shí)際使用過(guò)程中, 一般強(qiáng)調(diào)一個(gè)非突變的概念(immutable),即不直接修改原對(duì)象,而是用一個(gè)新的對(duì)象去替換它. 所以深拷貝是有意義的即開(kāi)辟一個(gè)新的堆內(nèi)存空間.
# 數(shù)組的深拷貝
> * 簡(jiǎn)單數(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ù)組中包含對(duì)象:
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} ];```
# 對(duì)象的深拷貝
> * 簡(jiǎn)單對(duì)象的拷貝:
ES6下有函數(shù)Object.assign();
```var obj1 = { a:1 , b:2 , c:3};
var obj2 =Object.assign({},obj1);
當(dāng)然這個(gè)函數(shù)還有很多其他的特點(diǎn), 詳見(jiàn)https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
- 當(dāng)然最簡(jiǎn)單的還是JSON得方法了,不過(guò)就是包含了方法就不能拷貝了.
var obj2 = JSON.parse( JSON.stringify(obj1) );