一、JS數(shù)據(jù)類型:
基本數(shù)據(jù)類型:Number(數(shù)字)、String(字符串)、Boolean(布爾值)、Null、Undefined
引用數(shù)據(jù)類型:Array(數(shù)組)、Function(函數(shù))、Object(對象);
基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的區(qū)別:
1、基本數(shù)據(jù)類型:
直接在棧內(nèi)存中保存數(shù)據(jù)值,按值訪問,變量與變量之間獨(dú)立存在,其中一個修改不會影響其他值;
數(shù)據(jù)比較時:比較數(shù)值大??;
2、引用數(shù)據(jù)類型:
變量保存的是內(nèi)存地址,訪問時訪問的是內(nèi)存的地址(指針),當(dāng)兩個變量引用的是同一個數(shù)據(jù)對象,一個改變,另一個也會改變;
比較的是保存數(shù)據(jù)的內(nèi)存地址
數(shù)據(jù)的一些特殊性:
Undefined:只有一個值的數(shù)據(jù)類型,定義未賦值,Undefined
Null:只有一個值的數(shù)據(jù)類型,是一個空指針對象,用typeof時,顯示是Object
如var a=null;
console.log("a:",a) ===>Object
undefined == null ====>true
二、深拷貝和淺拷貝
區(qū)別:
簡單理解:B復(fù)制A,A改變,B也會改變(淺拷貝);B不會改變(深拷貝)
實(shí)現(xiàn)深拷貝的方式:
1、遞歸去復(fù)制所有層級屬性:
function deepCopy(obj){
let copyObj=Array.isArray(obj)?[]:{};
for(obj && typeof obj==='object'){
for(key in obj){
if(obj.hasOwnProperty(key)){
//判斷obj子元素是是否為對象,如果是,遞歸復(fù)制
if(obj[key]&& typeof obj[key]==="object"){
copyObj[key]=deepCopy(obj[key]);
}else{
//如果不是,簡單復(fù)制
copyObj[key]=obj[key];
}
}
}
}
return copyObj;
}
深拷貝,是拷貝對象各個層級的屬性
slice根本不是真正的深拷貝?。?!,包括contact方法
2、借用JSON對象的parse和stringify
function deepClone(obj){
let _obj = JSON.stringify(obj), //將數(shù)組轉(zhuǎn)成字符串
objClone = JSON.parse(_obj); //將字符串轉(zhuǎn)成數(shù)組
return objClone
//方法可簡寫成:
//return JSON.parse(JSON.stringify(obj));
}
let a=[0,1,[2,3],4],
b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
a 輸出 [1,1,[1,3],4]
b 輸出 [0,1,[2,3],4]

3、借用JQ的extend方法
$.extend( [deep ], target, object1 [, objectN ] )
deep表示是否深拷貝,為true為深拷貝,為false,則為淺拷貝
target 為Object類型 目標(biāo)對象,其他對象的成員屬性將被附加到該對象上。
object1 objectN可選。 Object類型 第一個以及第N個被合并的對象。
let a=[0,1,[2,3],4],
b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
a 輸出 [1,1,[1,3],4]
b 輸出 [0,1,[2,3],4]
可以看到,效果與上面方法一樣,只是需要依賴JQ庫
