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]

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库

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值