深浅拷贝
什么是?
假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明就是浅拷贝。如果B没变,那就是深拷贝。
深浅拷贝的方式
-
遍历赋值
-
Object.create()
-
JSON.parse() 和 JSON.stringify()
遍历赋值 - 浅拷贝
let obj = { a: 'hello', b: { a: 'lili', b: 111 }, c: [11, 'Jack', 'Tom'] } // objCopy function simpleClone (objNew){ var obj = {} for(let i in objNew){ obj = objNew[i] } return obj } let objCopy = simpleClone(obj) console.log(obj) console.log(objCopy)
Object.create() - 浅拷贝
let objCopy = Object.create(obj) // objCopy上_propy_ console.log(objCopy)
遍历赋值 - 深拷贝
function deepClone(startObj,endObj){ var obj = endObj || {} for(let i in startObj){ if(typeof startObj[i] === 'object'){ obj[i] = startObj[i].constructor === Array?[]:{} deepClone(startObj[i],obj[i]) }else{ obj[i] = startObj[i] } } return obj } let objCopy = deepClone(obj) objCopy.b.a = 'world1' console.log(obj) console.log(objCopy)
Object.create() - 深拷贝
function deepClone(startObj,endObj){ var obj = endObj || {} for(let i in startObj){ if(typeof startObj[i] === 'object'){ obj[i] = startObj[i].constructor === Array?[]:Object.create(null) deepClone(startObj[i],obj[i]) }else{ obj[i] = startObj[i] } } return obj } let objCopy = deepClone(obj) objCopy.b.a = 'world1' console.log(obj) console.log(objCopy)
JSON.parse() 和 JSON.stringify()
let objCopy = JSON.parse(JSON.stringify(obj)) // object -> string -> object objCopy.b.a = 'world2' console.log(obj) console.log(objCopy)