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

一、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数据类型&深浅拷贝)