美文网首页
深浅拷贝

深浅拷贝

作者: frameworkofthin | 来源:发表于2019-04-13 14:52 被阅读0次

前置知识

基本类型直接存储于栈内存中
对象类型的值存储于堆内存中,对象的属性值存储的只是它的堆内存的地址(指针)。

什么是浅拷贝?什么是深拷贝?

  • 深浅拷贝主要是针对于对象类型
  • 浅拷贝:只能拷贝第一层的属性。拷贝的栈内存里面的值。
    对于基本类型,拷贝的是值,对于对象类型,拷贝的是内存地址
  • 深拷贝:递归拷贝对象的每一个属性。

如何实现浅拷贝?

let a = {
  name: '张三',
  job: {
    name: '腾讯'
  }
}
// 第一种:利用es6的Object.assign()
let b = Object.assign({}, a)
// 第二种:利用扩展运算符...
let c = { ...a }
// 第三种
function shallowClone (obj) {
  function isObject(obj) {
    console.log(typeof obj)
    return typeof obj === 'object' || typeof obj === 'function' && typeof obj !== null
  }

  if (!isObject(obj)) {
    throw new Error('不是对象')
  }

  let newObj = Array.isArray(obj) ? [...obj] : {...obj}
  return newObj
}

如何实现深拷贝?

JSON序列化
let a = {
  name: '张三',
  job: {
    name: '腾讯'
  }
}
// 第一种
JSON.parse(JSON.stringify())

该方法有以下的局限:

  • 会忽略undefine、symbol、函数
  • 不能解决循环引用的对象
简易版深拷贝
function deepClone (obj) {
  function isObject(obj) {
    return typeof obj === 'object' || typeof obj === 'function' && typeof obj !== null
  }

  if (!isObject(obj)) {
    throw new Error('不是对象')
  }

  let newObj = Array.isArray(obj) ? [...obj] : { ...obj }
  Object.keys(newObj).forEach(key => {
    const oldValue = obj[key]
    newObj[key] = isObject(oldValue) ? deepClone(oldValue) : oldValue
  })

  return newObj
}

参考链接:https://juejin.im/post/5b5dcf8351882519790c9a2e

相关文章

  • 2018-08-29

    深浅拷贝 1.根据拷贝内容的不同,分为深浅拷贝 深拷贝:内容...

  • js的深浅拷贝

    js的深浅拷贝可以分为数组的深浅拷贝和对象的深浅拷贝 一、数组的深浅拷贝如果只是简单的将数组中的元素付给另外一个数...

  • Python—浅拷贝与深拷贝

    浅拷贝 深拷贝 深浅拷贝的作用

  • 深浅拷贝

    先来了解一下这些:在js中变量类型基本分为两种:基本数据类型和引用数据类型;基本类型:Underfied Null...

  • 深浅拷贝

    浅拷贝是对一个对象的顶层拷贝。通俗的理解就是:拷贝了引用,并没有拷贝内容。 深拷贝是对于一个对象所有层次的拷贝(递...

  • 深浅拷贝

    深浅拷贝.copy 浅拷贝 这是一个方法,浅拷贝修改可变类型是会将原数据也一块修改 Copy.deepcopy 深...

  • 深浅拷贝

    1:is 和 ==的区别 is 是比较两个引用是否指向了同一个对象(地址引用比较)。== 是比较两个对象是否相等。...

  • 深浅拷贝

    函数的传递,与matlab不同,具有以下特点: 1.直接赋值会带来不同ID,例如,a=2,b=2 2.传递引用赋值...

  • 深浅拷贝

    最近一直被问到深浅拷贝的问题。自己也确实不太清楚怎么回事,现在来研究一下。 什么是深浅拷贝 浅拷贝:指针拷贝,不会...

  • 深浅拷贝

    概念: 浅复制:不拷贝对象本身,仅仅是拷贝指向对象的指针深复制:是直接拷贝整个对象内存到另一块内存中 注意:这里有...

网友评论

      本文标题:深浅拷贝

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