对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没 有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变,而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。
function type (obj) {
let toString = Object.prototype.toString
let map = {
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object String]': 'string',
'[object Function]': 'function',
'[object Array]': 'array',
'[object Date]': 'date',
'[object RegExp]': 'regExp',
'[object Undefined]': 'undefined',
'[object Null]': 'null',
'[object Object]': 'object'
}
return map[toString.call(obj)]
}
function deepCopy (data) {
let type = type(data)
let newData
let i
let len
if (type === 'array') {
newData = []
} else if (type === 'object') {
newData = {}
} else {
return data
}
if (type === 'array') {
for (i = 0, len = data.length; i < len; i++) {
newData.push(deepCopy(data[i]))
}
return newData
} else if (type === 'object') {
for (i in data) {
newData[i] = deepCopy(data[i])
}
return newData
}
}二、新版的深拷贝,早上利用上班一会时间弄出来的,欢迎来喷! (2019.5.17)
function deepCopy (origin) {
if (origin === undefined) return;
if (!(origin instanceof Object)) return origin;
var target = new origin.constructor;
for (var key in origin) {
if (!(origin[key] instanceof Object)) {
target[key] = origin[key];
} else {
target[key] = deepCopy(origin[key]);
}
}
return target;
}这个方法不仅可以拷贝引用值,而且基本值也支持,在原有的基础上缩减了更多的冗余代码,提高了容错率。

发表评论