JS 对象如何实现深拷贝

如何实现一个对象的深拷贝?

方法1:使用JSON (对象的序列化和反序列化)


// 如何实现一个对象的深拷贝?

//第一种方法
// 对象序列化

//创建一个对象
var obj = {
    name:'zhangsan',
    age:13
}
//因为是深拷贝 
//将obj序列化和反序列化后  赋值给一个obj1   
var obj1 = JSON.parse(JSON.stringify(obj));
console.log(JSON.stringify(obj), typeof JSON.stringify(obj));  //string
console.log(obj1,typeof obj1);   // { name: 'zhangsan', age: 13 }    object
console.log(obj == obj1);   //false 
console.log(obj === obj1);  //false

//改变obj1中的name属性
obj1.name = 'lisi';
//打印输出的obj1的name属性没有改变   
//验证深拷贝只作用于栈区,栈区中变量和变量之间是独立存在的,值得变换不会互相影响
console.log(obj,obj1);   // { name: 'zhangsan', age: 13 } { name: 'lisi', age: 13 }

方法2:第三方库lodash 的cloneDeep

Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。
要用lodash标签库 要先导入lodash

在当前目录下 终端中 执行指令 npm i --save lodash


//第二种方法
// 第三方库lodash的cloneDeep
//lodash常用_来定义
var _ = require('lodash');
//创建一个对象
var obj = {
    name:'zhangsan',
    age:18
}
//使用cloneDeep方法   cloneDeep相当于clone,就是递归拷贝(这个我不是很明白,但是是这么用的)
var obj2 = _.cloneDeep(obj);
//同样是改变obj2的name属性
obj2.age = 20;
//打印输出obj和obj2   发现只有obj2的name属性值改变了  原理和方法一样
console.log(obj);  //{ name: 'zhangsan', age: 18 }

console.log(obj2);  //{ name: 'zhangsan', age: 20 }

JS 对象如何实现深拷贝_第1张图片

JS 对象如何实现深拷贝_第2张图片

又完事了。。。。应该是有三种方法的,待更新、、、、、、、、

你可能感兴趣的