浅拷贝
递归
浅拷贝是创建一个对象,这个对象有着原始对象的一份精确拷贝。如果属性是基本数据类型,拷贝的就是基本数据类型的值,如果是引用数据类型,拷贝的是内存地址,所以如果其中一个对象改变了这个地址,就会影响另一个对象。(如下图)
let obj = {
name: 'lyz',
hobbies: ['study', ['TV', 'sing']]
}
function lightCopy(obj) {
let newObj = obj.constructor()
// let newObj = {}
for(var key in obj) {
if(obj.hasOwnProperty(key)) {
newObj[key] = obj[key]
}
}
return newObj
}
let newObj = lightCopy(obj)
newObj.name = 'my'
newObj.hobbies[0] = 'computer'
console.log(obj)
console.log(newObj)
Object.assign
…(展开运算符)
Array.prototype.concat
Array.prototype.slice
深拷贝
递归
深拷贝是将对象从内存中完善的拷贝一份,从对内存中开辟一个新的区域存放新对象,对对象中的子对象进行递归,且修改新对象不会影响原来的对象。(如下图)
let obj = {
name: 'lyz',
hobbies: ['study', ['TV', 'sing']],
reg: /99/
}
function deepCopy(obj) {
let newObj = {}
if(obj === null) return
if(obj instanceof Date) return new Date(obj)
if(obj instanceof RegExp) return new RegExp(obj)
if(typeof(obj) !== 'object' ) return obj
for(let key in obj) {
if(obj.hasOwnProperty(key)) {
newObj[key] = deepCopy(obj[key])
}
}
return newObj
}
let newObj = deepCopy(obj)
newObj.name = 'my'
newObj.hobbies[0] = 'computer'
console.log(obj)
console.log(newObj)
JSON.parse(JSON.stringify())
缺点:对正则、函数不能深拷贝
let obj = {
name: 'lyz',
hobbies: ['study', ['TV', 'sing']],
reg: /99/,
get: function () {
}
}
let newO = JSON.parse(JSON.stringify(obj))
console.log(newO)