浅拷贝(shallow clone)
特征:只拷贝对象的一层的数据。
注意:浅拷贝需要拷贝对象第一层的数据,而不是赋值操作。
-
浅拷贝实现的三种方式
- Object.assign()
- 使用es6提供的拓展运算符
const newObj = {...oldObj}
- Array.prototype.slice()。slice() 方法返回一个新的数组对象,这一对象是一个由 begin和 end(不包括end)决定的原数组的浅拷贝。原始数组不会被改变。
深拷贝(deep clone)
特征:拷贝对象所有层的数据。拷贝的数据不会影响原数据。
-
深拷贝实现的方式
递归
function kaobei (newObj, obj) {
// 遍历
for (let key in obj) {
if (obj[key] instanceof Array) {
// obj[key] 是数组
// obj[key]是数组
newObj[key] = []
kaobei(newObj[key], obj[key])
} else if (obj[key] instanceof Object) {
// obj[key] 是对象
// obj[key]再遍历拷贝
newObj[key] = {}
kaobei(newObj[key], obj[key])
} else {
newObj[key] = obj[key]
}
}
}
如果原对象存在循环引用,则上述代码会有问题。
解决思路:如果当前要处理的是一个对象,就先去检查这个对象是否已经处理过了。
和朋友一切探讨的,转载自博主-- clp66