深拷贝和浅拷贝在开发中我们会经常使用,特别是在面试过程中会被经常提起,简单来说
浅拷贝:就是对引用的拷贝(还是指向同一内存地址)
深拷贝:就是对整个内容的拷贝(完全不同的内存地址)
比如我们有一下对象,当我们把obj 赋值给obj1 时,如果我们增加 obj1 likes 内的元素个数,那么obj 中likes 也会相应进行修改,这有时不是我们想要的结果,此时就需要深拷贝来实现该功能
var obj = {
name: "lixiansheng",
age: 27,
likes: ["足球", "电视", "游戏"]
}
var obj1 = {
}
深拷贝实现,此时我们修改obj1 时就不会影响到obj 了
- 1.创建对象,进行原属性的遍历
- 2.使用hasOwnProperty筛选掉原型链上的属性
- 3.使用typeof判断是否是object(考虑到null的情况出现),如果不是这直接赋值
- 4.如果是object 则判断是数组还是对象
- 5.进行递归
//深拷贝
function deepClone(origin, target) {
var target = target || {},
toStr = Object.prototype.toString,
arrayStr = "[object Array]"
for (var prop in origin) {
if (origin.hasOwnProperty(prop)) {
if (origin[prop] !== "null" && typeof(origin[prop]) == "object") {
if (toStr.call(origin[prop]) == arrayStr) {
target[prop] = []
} else {
target[prop] = {}
}
deepClone(origin[prop], target[prop])
} else {
target[prop] = origin[prop]
}
}
}
}
网友评论