对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没 有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变,而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。
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; }
这个方法不仅可以拷贝引用值,而且基本值也支持,在原有的基础上缩减了更多的冗余代码,提高了容错率。
发表评论