01前端基礎(chǔ)---JS數(shù)據(jù)類型&深淺拷貝

一、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]
image.gif

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庫
image.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容