一、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]
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库