浅拷贝和深拷贝的说法只存在于引用类型数据,不清楚原始值和引用值的可以回顾第四章
今天就拿一只小花猫作为例子。
let cat = {
name: '咪咪',
age: 2,
colors: ['橘色', '白色', '黑色'],
eyes: {
'左': '琥珀',
'右': '水蓝'
}
}
拷贝
仅拷贝了cat的引用地址,cat2与cat共用一个对象,修改cat2其实也是修改了cat。
浅拷贝
仅能实现第一层属性独立,修改cat2的name时cat不受影响,更深一层依然只是复制了引用地址,修改了cat2的eyes里的右,cat也会跟着被修改
深拷贝
独立,互不影响
注意:该方法不适用于有undefined和function的引用数据类型中。
浅拷贝的实现方式
1、刚刚举例用到的:Object.assign()
2、ES6的…(扩展运算符)
3、for…in
4、Object.create()
5、用对象解构方法(了解对象解构前往第八章)
深拷贝的实现方式
1、刚刚举例用到的:JSON.parse(JSON.Stringify(obj))
2、for…in 加 递归(原理就是判断第一层属性的类型是否为引用值,如果是就再走一遍方法,一层一层拷贝)
const deepCopy = function (obj) {
let resObj = Array.isArray(obj) ? [] : {}
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] && typeof obj[key] === 'object') {
resObj[key] = deepCopy(obj[key])
} else {
resObj[key] = obj[key]
}
}
}
return resObj
}
let cat2 = deepCopy(cat)
爱酱有话说:还有很多方法,有待补充。