美文网首页
JavaScript深拷贝

JavaScript深拷贝

作者: 六寸光阴丶 | 来源:发表于2020-04-13 09:51 被阅读0次

写在前面

如果本文对您有所帮助,就请点个关注吧!

手写JavaScript深拷贝

源代码

function deepCopy(obj, cache = []) {
  // 拷贝函数
  if (typeof obj === 'function') {
    return eval(`(${obj.toString()})`)
  }
  // 拷贝基本数据类型
  if (obj === null || typeof obj !== 'object') {
    return obj
  }
  // 拷贝日期
  if (Object.prototype.toString.call(obj) === '[object Date]') return new Date(obj)
  // 拷贝正则
  if (Object.prototype.toString.call(obj) === '[object RegExp]') return new RegExp(obj)
  // 拷贝错误
  if (Object.prototype.toString.call(obj) === '[object Error]') return new Error(obj)
  // 处理循环引用
  const item = cache.filter(item => item.original === obj)[0]
  if (item) return item.copy
  // 对象数组分类讨论
  let copy = Array.isArray(obj) ? [] : {}
  cache.push({
    original: obj,
    copy
  })
  // 循环递归拷贝
  Object.keys(obj).forEach(key => {
    copy[key] = deepCopy(obj[key], cache)
  })
  return copy
}

测试

let obj = {
  num: 0,
  str: 'str',
  boolean: true,
  unf: undefined,
  nul: null,
  symbol: Symbol(),
  obj: {
    name: '我是一个对象',
    id: 1
  },
  arr: [0, 1, 2],
  func: function () {
    console.log('我是一个函数')
  },
  func2: () => {
    console.log('我是一个函数')
  },
  date: new Date(),
  reg: new RegExp('/我是一个正则/ig'),
  err: new Error('我是一个错误')
}

obj.obj.d = obj
console.log(obj)
let clone = deepCopy(obj)
console.log(clone)

测试结果

{ num: 0,
  str: 'str',
  boolean: true,
  unf: undefined,
  nul: null,
  symbol: Symbol(),
  obj: { name: '我是一个对象', id: 1, d: [Circular] },
  arr: [ 0, 1, 2 ],
  func: [Function: func],
  func2: [Function: func2],
  date: 2020-04-14T04:37:28.637Z,
  reg: /\/我是一个正则\/ig/,
  err:
   Error: 我是一个错误
       at Object.<anonymous> (d:\Document\Programming\Python\clone.js:21:8)
       at Module._compile (internal/modules/cjs/loader.js:778:30)
       at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
       at Module.load (internal/modules/cjs/loader.js:653:32)
       at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
       at Function.Module._load (internal/modules/cjs/loader.js:585:3)
       at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
       at startup (internal/bootstrap/node.js:283:19)
       at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3) }
{ num: 0,
  str: 'str',
  boolean: true,
  unf: undefined,
  nul: null,
  symbol: Symbol(),
  obj: { name: '我是一个对象', id: 1, d: [Circular] },
  arr: [ 0, 1, 2 ],
  func: [Function],
  func2: [Function],
  date: 2020-04-14T04:37:28.637Z,
  reg: /\/我是一个正则\/ig/,
  err:
   Error: Error: 我是一个错误
       at deepCopy (d:\Document\Programming\Python\clone.js:39:72)
       at Object.keys.forEach.key (d:\Document\Programming\Python\clone.js:48:17)
       at Array.forEach (<anonymous>)
       at deepCopy (d:\Document\Programming\Python\clone.js:47:20)
       at Object.<anonymous> (d:\Document\Programming\Python\clone.js:53:14)
       at Module._compile (internal/modules/cjs/loader.js:778:30)
       at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
       at Module.load (internal/modules/cjs/loader.js:653:32)
       at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
       at Function.Module._load (internal/modules/cjs/loader.js:585:3) }

相关文章

  • 浅拷贝和深拷贝

    本文参考:JavaScript中的浅拷贝和深拷贝js 深拷贝 vs 浅拷贝深入剖析 JavaScript 的深复制...

  • 深入理解JavaScript中的堆与栈 、浅拷贝与深拷贝

    JavaScript中的浅拷贝与深拷贝 学了这么长时间的JavaScript想必大家对浅拷贝和深拷贝还不太熟悉吧,...

  • 理解JavaScript中浅拷贝和深拷贝的区别

    要理解 JavaScript中浅拷贝和深拷贝的区别,首先要明白JavaScript的数据类型 JavaScript...

  • js浅拷贝和深拷贝

    javaScript的变量类型 javaScript的变量类型基本类型:引用类型: 浅拷贝和深拷贝的区分 浅拷贝浅...

  • JavaScript深拷贝 浅拷贝

    JavaScript深拷贝 浅拷贝 JavaScript 数据类型分为两种: 基础类型:像Number、Strin...

  • javascript深拷贝

  • JavaScript 深拷贝

    Method1 JSON 使用 JSON 方法,先将 对象 转换成字符串,再将字符串转换成 JSON形式对象 Me...

  • JavaScript深拷贝

    先说下什么是浅拷贝和深拷贝的区别浅拷贝: 就是把一个对象内的属性赋值到另一个对象内, 但是如果属性是对象的话就不可...

  • Javascript深拷贝

    什么是深拷贝 创建一个新的对象或数组时,将原对象/数组的“值”拷贝,而不是“引用”。 深拷贝 数组拷贝不存在多层嵌...

  • JavaScript深拷贝

    写在前面 如果本文对您有所帮助,就请点个关注吧! 手写JavaScript深拷贝 源代码 测试 测试结果

网友评论

      本文标题:JavaScript深拷贝

      本文链接:https://www.haomeiwen.com/subject/bqnwmhtx.html