了解之前,首先要知道什么是值類(lèi)型和應(yīng)用類(lèi)型
- 常見(jiàn)的值類(lèi)型有:數(shù)值、布爾值、null、undefined。
- 常見(jiàn)的引用類(lèi)型有:對(duì)象、數(shù)組、函數(shù)。
用代碼來(lái)詳細(xì)理解
var arr1=[1,2,3,4];
var arr2=arr1;
arr1.push(5)
console.log(arr1);//1,2,3,4,5
console.log(arr2);//1,2,3,4,5
這里只改變了arr1,而arr2的值也改變了,這是因?yàn)槎xarr1時(shí),創(chuàng)建了一個(gè)空間,并且arr1指向它,再定義一個(gè)arr2,如果讓arr2=arr1,就相當(dāng)于把a(bǔ)rr2也指向了arr1所指向的空間,所以改變arr1或arr2都可以改變這個(gè)空間里面的值,這就是引用類(lèi)型。如果var arr2=[],讓他等于一個(gè)新的數(shù)組,就會(huì)定義一個(gè)新的空間,而把a(bǔ)rr2=arr1再次寫(xiě)進(jìn)去時(shí),相當(dāng)于把a(bǔ)rr1的指向有賦給了arr2,所以有變成上面的樣子。僅個(gè)人理解。
有什么方法能讓arr2==arr1&&arr2和arr1不會(huì)相互影響?
var arr1=[1,2,3,4,5];
var arr2=copy(arr1);
function copy(arr){
var arrs=[];
for(let i=0;i<arr.length;i++){
arrs.push(arr1[i])
}
return arrs
}
這樣就可以實(shí)現(xiàn)想要的功能;
下面,如果是一個(gè)對(duì)象,對(duì)象里面有數(shù)組,實(shí)現(xiàn)上面相同的功能
var obj = { a:1, arr: [2,3] };
var shadowObj = shadowCopy(obj);
function shadowCopy(src) {
var dst = {};
for (var prop in src) {
console.log(src.hasOwnProperty(prop))//判斷src里面有沒(méi)有這個(gè)屬性
if (src.hasOwnProperty(prop)) {
dst[prop] = src[prop];
}
}
return dst;
}
改變obj,看shadowObj是否會(huì)發(fā)生變化
obj.name="小明"
console.log(obj);// { a:1, arr: [2,3],name:'小明' }
console.log( shadowObj );// { a:1, arr: [2,3] }
雖然看著的確是實(shí)現(xiàn)了功能,但是里面的數(shù)組還是有問(wèn)題的;
obj.arr[0]=9;
console.log(obj.arr[0]);//9
console.log(shadowObj.arr[0]);//9
這是因?yàn)樵诒闅v復(fù)制時(shí),把數(shù)組對(duì)象直接的指向復(fù)制進(jìn)去,所以這里的對(duì)象還是引用類(lèi)型,如果需要的話(huà),可以在上面代碼的基礎(chǔ)上面做判斷
if(prop==arr){
for(){
把數(shù)組再遍歷一遍
}
}