美文网首页
01前端基础---JS数据类型&深浅拷贝

01前端基础---JS数据类型&深浅拷贝

作者: hbmya | 来源:发表于2022-07-23 19:18 被阅读0次

    一、JS数据类型:
    基本数据类型:Number(数字)、String(字符串)、Boolean(布尔值)、Null、Undefined

    引用数据类型:Array(数组)、Function(函数)、Object(对象);

    基本数据类型和引用数据类型的区别:

    1、基本数据类型:
    直接在栈内存中保存数据值,按值访问,变量与变量之间独立存在,其中一个修改不会影响其他值;
    数据比较时:比较数值大小;

    2、引用数据类型:
    变量保存的是内存地址,访问时访问的是内存的地址(指针),当两个变量引用的是同一个数据对象,一个改变,另一个也会改变;
    比较的是保存数据的内存地址
    数据的一些特殊性:
    Undefined:只有一个值的数据类型,定义未赋值,Undefined
    Null:只有一个值的数据类型,是一个空指针对象,用typeof时,显示是Object
    如var a=null;
    console.log("a:",a) ===>Object
    undefined == null ====>true
    二、深拷贝和浅拷贝
    区别:
    简单理解:B复制A,A改变,B也会改变(浅拷贝);B不会改变(深拷贝)
    实现深拷贝的方式:
    1、递归去复制所有层级属性:

    function deepCopy(obj){
        let copyObj=Array.isArray(obj)?[]:{};
        for(obj && typeof obj==='object'){
            for(key in obj){
                if(obj.hasOwnProperty(key)){
                    //判断obj子元素是是否为对象,如果是,递归复制
                    if(obj[key]&& typeof obj[key]==="object"){
                        copyObj[key]=deepCopy(obj[key]);
                    }else{
                        //如果不是,简单复制
                        copyObj[key]=obj[key];
                    }
                }
                        
            }
        }
        return copyObj;
    }
    

    深拷贝,是拷贝对象各个层级的属性
    slice根本不是真正的深拷贝!!!,包括contact方法
    2、借用JSON对象的parse和stringify

    function deepClone(obj){
        let _obj = JSON.stringify(obj),   //将数组转成字符串
        objClone = JSON.parse(_obj);      //将字符串转成数组
        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类型 目标对象,其他对象的成员属性将被附加到该对象上。
    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

    相关文章

      网友评论

          本文标题:01前端基础---JS数据类型&深浅拷贝

          本文链接:https://www.haomeiwen.com/subject/xsbbirtx.html