在了解深拷贝和浅拷贝之前,我们先梳理一下:
JavaScript中,分为基本数据类型(原始值)和复杂类型(对象),同时它们各自的数据类型细分下又有好几种数据类型
数字Number 字符串String 布尔Boolean Null Undefined Symbols BigInt
基本数据类型在内存当中,是存储在栈Stack
日期Dete,对象Object,数组Array,方法Function, 正则regex,带键的集合:Maps, Sets, WeakMaps, WeakSets
下面对于对象的操作,都可以参照上图进行思考
只是拷贝了某一层的属性,或者某一层,没有全部拷贝到另外的对象上
let userInfo = { name: "zhangsan", age: "29", say: function () { console.log("hello"); }, child: [ { name: "zhangsan01", }, ], };
// 对象解构... let info = { ...userInfo }; info.name = "lisi"; info.child.name = "lisi001"; info.say(); console.log("userInfo", userInfo); console.log("info", info); userInfo和info中的child.name都改成了---->"lisi001"
let info = {}; Object.assign(info, userInfo); info.name = "lisi"; info.child.name = "lisi001"; console.log("userInfo", userInfo); console.log("info", info);
let info = JSON.parse(JSON.stringify(userInfo)); info.name = "lisi"; info.child.name = "lisi001"; console.log("userInfo", userInfo); console.log("info", info);
let info = {}; for (let key in userInfo) { info[key] = userInfo[key]; } info.name = "lisi"; info.child.name = "lisi001"; console.log("userInfo", userInfo); console.log("info", info);
以上浅拷贝方法,有些拷贝只能拷贝第一层,有些可以拷贝多层,
但是当属性类型是方法时,还是浅拷贝,
因此我们在开发中,使用浅拷贝,需要注意,同时,出了拷贝function,类似正则,date等数据类型没有一一列举,感兴趣的同学可以自己写一些demo,去校验更为复杂和数据类型更丰富的数据。
所有的属性都拷贝到新的对象上
文档地址:深拷贝cloneDeep https://www.lodashjs.com/docs/lodash.cloneDeep
当我们操作复杂数据类型的时候,都是在操作栈内存Stack的内存地址,指针指向对象在堆内存heap的数据。
传入的对象是使用对象字面量{}创建的对象还是由构造函数生成的对象
如果对象是由构造函数创建出来的,那么是否要拷贝原型链上的属性
如果要拷贝原型链上的属性,那么如果原型链上存在多个同名的属性,保留哪个
针对的数据类型,属性的数据类型,各自的缺陷,适用的业务场景,自己造轮子or使用原生方法,工具类
文章个人博客地址:javaScript中深拷贝和浅拷贝梳理
创作不易,转载请注明出处和作者。