拷貝,拷貝字面意思就算cope钞艇,我們要將一個或者一些數(shù)據(jù)為模板復(fù)制到另一個新數(shù)據(jù)中啄寡,怎么復(fù)制呢,在這之前我們要知道js數(shù)據(jù)是怎樣存儲的哩照,才能進(jìn)行更清晰的知道下一步復(fù)制是如何操作的
首先:
數(shù)據(jù)分為基本數(shù)據(jù)類型(String(字符串), Number(數(shù)字),?Boolean(布爾), Null, Undefined挺物,NAN)和引用數(shù)據(jù)類型。
基本數(shù)據(jù)類型:是指直接存儲在棧中的數(shù)據(jù)
引用數(shù)據(jù)類型:存儲的是飘弧,該對象在棧中的地址识藤,真實的數(shù)據(jù)存放在堆內(nèi)存里
對于淺拷貝
1.淺拷貝只會復(fù)制上圖中的棧內(nèi)存砚著,所以對于對象來說,只會復(fù)制指向某個對象的指針痴昧,而不復(fù)制對象本身稽穆,新舊對象還是共享同一塊內(nèi)存。
2.如果屬性是基本類型赶撰,拷貝的就是基本類型的值舌镶;如果屬性是引用類型,拷貝的就是內(nèi)存地址 豪娜,因此如果其中一個對象改變了這個地址餐胀,那么另外一個拷貝或者背拷貝對象也會發(fā)生改變。
例:
var arr1 = ['red','pink'];
var arr2 = arr1;//cope
console.log(arr2)//['red','pink'];
arr1.push('black') ;//改變arr1的值
console.log(arr2)//['red','pink','black']
console.log(arr1)//["red", "pink", "black"]
對于深拷貝
深拷貝必須是cope對方的每一個基本數(shù)據(jù)類型的新對象瘤载,新對象跟原對象不共享內(nèi)存否灾,修改新對象不會改變原對象,修原對象也不會改變新對象鸣奔,完完全全的是倆個獨立占用內(nèi)存的對象墨技。
例:
var arr1 = ['red','pink'];
var arr2=[]
for(var key in arr1){
var arr2.push(key); 復(fù)制
}
console.log(arr2)//['red','pink'];
arr1.push('black') ;//改變arr1的值
console.log(arr2)//['red','pink']
console.log(arr1)//["red", "pink", "black"]
深拷貝有許多方法:例如
?for循環(huán)(最不可取)
jquery的$.extend方法(非常適用)
JSON中的
JSON.stringify(obj)
JSON.parse(_obj)
(弊端無法cope對象中的方法)