对象拷贝

2021-04-09  本文已影响0人  行走的蛋白质

一. 深拷贝 / 浅拷贝

1. 浅拷贝: 指针拷贝, 让拷贝前和拷贝后对象的指针指向同一块内存地址
let obj1 = {
    a: 1,
    b: 2
}
let obj2 = obj1
obj1.a = 3
console.log(obj2.a) // 3
2. 深拷贝
1). JSON.parse(JSON.stringify()) 实现深拷贝的不足
const obj = {
  date: new Date()
}
const newObj = JSON.parse(JSON.stringify(obj))
console.log(Object.prototype.toString.call(obj.date)) // [object Date]
console.log(Object.prototype.toString.call(newObj.date)) // [object String]
console.log(newObj.date) // 2021-04-09T02:12:31.440Z
const obj = {
  date: new Date(),
  regExp: new RegExp('\d'),
  error: new Error('error')
}
const newObj = JSON.parse(JSON.stringify(obj))
console.log(newObj.regExp) // {}
console.log(newObj.error) // {}
const obj = {
  date: new Date(),
  regExp: new RegExp('\d'),
  error: new Error('error'),
  fn: function() {
    console.log('function')
  },
  und: undefined
}
const sym = Symbol('sym')
test[sym] = 'sym'
const newObj = JSON.parse(JSON.stringify(obj))
console.log(newObj) // {date: "2021-04-10T01:47:04.806Z", regExp: {…}, error: {…}}
const obj = {
  date: new Date(),
  regExp: new RegExp('\d'),
  error: new Error('error'),
  fn: function() {
    console.log('function')
  },
  und: undefined,
  nan: NaN,
  infi: Infinity
}
const newObj = JSON.parse(JSON.stringify(obj))
console.log(Object.prototype.toString.call(obj.date))
console.log(Object.prototype.toString.call(newObj.date))
console.log(newObj.nan) // null
console.log(newObj.infi) // null
function Person(name) {
  this.name = name
}
const zs = new Person('zhangsan')
const obj = {
  date: new Date(),
  regExp: new RegExp('\d'),
  error: new Error('error'),
  fn: function() {
    console.log('function')
  },
  und: undefined,
  nan: NaN,
  infi: Infinity,
  zs
}
const newObj = JSON.parse(JSON.stringify(obj))
console.log(obj.zs)
console.log(newObj.zs)
compare 对象循环引用
2). Reflect 递归实现
function deepClone(obj) {
    // 判断如果 obj 是基本类型数据或者函数, 直接返回
    if (!obj || typeof obj !== 'object') return obj;
    if (obj instanceof Error) {
        return new Error(obj);
    }
    if (obj instanceof RegExp) {
        return new RegExp(obj);
    }
    if (obj instanceof Date) {
        return new Date(obj);
    }
    const result = Array.isArray(obj) ? [] : {};
    Reflect.ownKeys(obj).forEach(item => {
        if (obj[item] && typeof obj[item] === 'object') {
            result[item] = deepClone(obj[item]);
        } else {
            result[item] = obj[item];
        }
    })
    return result;
}
// 测试
const a = '111'
console.log(deepClone(a))
const test = {
    num: 0,
    str: '',
    boolean: true,
    unf: undefined,
    nul: null,
    obj: {
        name: '我是一个对象',
        num: 1,
        id: 1
    },
    arr: [0, 1, 2],
    func: function() {
        console.log('我是一个函数')
    },
    date: new Date(0),
    reg: new RegExp('我是一个正则', 'ig'),
    err: new Error('error')
}
const sym = Symbol('我是一个Symbol')
test[sym] = 'Symbol'
console.log(deepClone(test))
console.log(deepClone(test.date))
console.log(deepClone(test.reg))
console.log(deepClone(test.err))
Reflect_deepClone_result
上一篇 下一篇

猜你喜欢

热点阅读