工作中經(jīng)常遇到的一個(gè)問(wèn)題,如何深拷貝一個(gè)對(duì)象徒蟆?
最簡(jiǎn)單的方式就是通過(guò)JSON.parse(JSON.stringify(Obj))
作谚。但是當(dāng)值是undefined、function鸿脓、symbol
在轉(zhuǎn)換過(guò)程中會(huì)被忽略抑钟,數(shù)組中會(huì)返回null
。
《你不知道的 JavaScript》中寫到野哭,所有 安全的 JSON 值 (JSON-safe)都可以使用 JSON.stringify(..) 字符串化味赃。什么是不安全的JSON值呢? undefined 虐拓、 function 、 symbol (ES6+)和包含循環(huán)引用(對(duì)象之間相互引用傲武,形成一個(gè)無(wú)限循環(huán))的 對(duì)象 都不符合 JSON 結(jié)構(gòu)標(biāo)準(zhǔn)蓉驹。
let person = {
name: 'liming',
say: function() {
console.log(`my name is ${this.name}`)
},
_id: Symbol('id'),
und: undefined,
friends: ['tom','lilei',undefined]
}
let copyPerson = JSON.parse(JSON.stringify(person))
console.log(copyPerson)
// {
// friends: ['tom','lilei', null],
// name: 'liming'
// }
函數(shù)實(shí)現(xiàn)
function deepCopy(obj) {
if (typeof obj !== 'object') return
var newObject = obj instanceof Array ? [] : {}
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
newObject[key] = typeof obj[key] === 'object' && obj[key] ? deepCopy(obj[key]) : obj[key]
}
}
return newObject
}