Object.prototype.num = 1
var person = {
name: "张三",
age: 18,
height: 180,
son: {
first: {
name: "Jenny",
age: 18
},
second: {
name: "Richard",
age: 18
},
},
car: ["Benz", "Mazda"]
}
浅拷贝以及浅拷贝所存在的问题:
//person2里面多了个num属性
//person2里面的son一变,person里面也跟着变
person2 = {}
for (const key in person) {
person2[key] = person[key]
}
person2.name = "Lee"
person2.son.third = "Ben"//person里面也同时改变了,浅拷贝的问题所在
console.log(person, person2)
深拷贝:
function deepClone(origin, target) {
//如果不传对象就传{}
var target = target || {},
toStr = Object.prototype.toString,
arrType = '[object Array]';
for (var key in origin) {
if (origin.hasOwnProperty(key)) {//这是为了保证key是自己的,不是Prototype里面的
//typeof null === 'object' --->这是个遗留问题
//判断键 是否为引用值
if (typeof (origin[key]) === 'object' && origin[key] !== null) {
//判断origin[key]其为数组类型还是对象
toStr.call(origin[key]) === arrType ? target[key] = []
: target[key] = {};
deepClone(origin[key], target[key]);
} else {//判断键 不是 引用值 的时候
target[key] = origin[key]
}
}
}
return target;
}
var person3 = deepClone(person);
person3.son.third = {
name: "hello world",
age: 1
}
console.log(person, person3)
原文始发于微信公众号(迪哥讲事):JS基本功系列-浅拷贝与深拷贝
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论