JS深拷贝

工作中经常遇到的一个问题,如何深拷贝一个对象?
最简单的方式就是通过JSON.parse(JSON.stringify(Obj))。但是当值是undefined、function、symbol 在转换过程中会被忽略,数组中会返回null

《你不知道的 JavaScript》中写到,所有 安全的 JSON 值 (JSON-safe)都可以使用 JSON.stringify(..) 字符串化。什么是不安全的JSON值呢? undefined 、 function 、 symbol (ES6+)和包含循环引用(对象之间相互引用,形成一个无限循环)的 对象 都不符合 JSON 结构标准。

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'
//  }

函数实现

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
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容