js object 深、浅拷贝

基本类型值

  • 常见基本数据类型:string、number、boolean、undefined、null、symbol;
  • 基本类型是按值来访问的,从一个变量复制基本类型到另一个变量后,这两个变量是完全独立的,二者互不影响。
var str = "zlq":
var str2 = str;
str2 = "qlz";
console.log(str);   //zlq

引用类型值

  • 常见引用类型:Object、Array、Function、Math、Date等;
  • 引用类型值时引用类型的实例,是保存在堆内存中的一个对象。同样和基本类型值一样会将变量的值复制到新变量上,不同的是对于变量的值,它是一个指针,指向存储在堆内存中的对象。
var obj1 = {'name': 'zlq'};
var obj2 = obj1;
obj2.name = 'qlz';
console.log(obj1); // {'name': 'qlz'}
console.log(obj2); // {'name': 'qlz'}

浅拷贝: 如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是内存地址;所以如果其中一个对象改变了这个地址,就会影响到另一个对象。
常见方法:Object.assign(target, …sources);扩展运算符

注意:
Object.assign、… 均为第一层深拷贝,第二层起为浅拷贝;
拷贝后与拷贝前的第二层对象或数组仍然是引用的同一个地址。

深拷贝: 是指完全复制一个新的对象出来,它们在堆内存中完全占据两个不同的内存地址。
常见方法:JSON.parse(JSON.stringify());cloneDeep();

function deepClone(source) {
	var temp = source.constructor === Array ? [] : {};   // 初始化
	for(var keys in source) {
		if(source.hasOwnProperty(keys)) {
			if(source[keys] && typeof(source[keys]) === 'object') {  // 判断是否是引用类型
				temp[keys] = source[keys].constructor === Array ? [] : {};
				temp[keys] = deepClone(source[keys]);
			} else {  // 基本类型直接赋值、Function也会赋值
				temp[keys] = source[keys];
			}
		}
	}
	return temp;
}

JSON.stringify() 拷贝时注意事项:

  1. 如果有函数、undefined、symbol,经过 JSON.stringify() 处理后 JSON 字符串中的键值对会消失;
  2. 无法拷贝不可枚举的属性,无法拷贝对象的原型链;
  3. 拷贝Date引用类型,会变成字符串

总结:

  • 实际开发中,并不需要拷贝很多特殊的引用类型,深拷贝直接使用 JSON.parse(JSON.stringify()) 即可。
  • 一个完整的拷贝,需要考虑很多边界条件。因此在开发中,建议使用第三方库,如 webpack-merge 等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值