1.
// 第一种 解构赋值 缺点:只能拷贝对象的第一层,如果对象中属性也是对象的话,没有办法进行深度的拷贝
var obj = {
username: "张三",
age: 18
}
var obj1 = {
...obj
}
改变obj的值,不会影响obj1的值
2.
// 第二种 对象的合并
var obj2 = Object.assign({}, obj);
console.log(obj2);
3.
/ 第三种 JSON暴力转换
var obj3 = JSON.parse(JSON.stringify(obj));
console.log(obj3);
当对象中还包含对象时,怎么实现深拷贝
(1)定义并初始化一个对象
var person = {
name1: "张三",
age1: 18,
person1: {
name2: "李四",
age2: 21,
person2: {
name2: "王五",
age2: 12,
}
}
}
(2)如果对person对象进行遍历,将person的属性全部给一个新的对象,那么当最外面的一层person对象中的属性的属性值变化时,不会影响到里面的值。
下面两行 console.log(obj);不会有变化
var obj={};
for (key in person) {
obj[key] = person[key]
}
console.log(obj);
person.name1="张三改";
console.log(obj);
(3)如果对第二层对象person1进行更改或者是第三层对象person2进行更改,那么obj中也会改变
person.person1.name2="李四改";
console.log(obj);
person.person1.name2="李四改";
console.log(obj);
person.person1.person2.name2="王五改";
console.log(obj);
function deepClone(obj, newObj) {
var newObj = newObj || {};
for (let key in obj) {
if (typeof obj[key] == 'object') {
newObj[key] = (obj[key].constructor === Array) ? [] : {}
deepClone(obj[key], newObj[key]);
} else {
newObj[key] = obj[key]
}
}
return newObj;
}
console.log(deepClone(person,{}));
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。