美文网首页
记录一次JS 的浅拷贝和深拷贝

记录一次JS 的浅拷贝和深拷贝

作者: 长街漫步 | 来源:发表于2019-09-27 14:33 被阅读0次

简单理解浅拷贝和深拷贝

博客地址:https://www.zhouhaipeng.com/
github https://github.com/Roc-zhou

什么是浅拷贝?

简单来说 有个 A 和 B,我们把A 复制给了B,当我们修改B 的时候 发现 A 的值也会发生改变,这就是浅拷贝

  • 举个例子
let a = [{ name: '张三' }],
b = a

b[0].name = '李四'
console.log(a);  // [{ name: '李四' }]
console.log(a); //  [{ name: '李四' }]
  • 使用图解释一下


    9419407-1d09c5b4a0a06252.png
    9419407-ff2d0c88f14929a3.png

从图中我们可以看到 a和b 全部 都指向了 同一个 堆内存的值 ,所以我们改变 b 的数据 a也会 改变 。

那什么是深拷贝呢?

理解了浅拷贝,我猜 深拷贝就是修改 b 的值 a 还是原来的值。

  • 还是举个例子先
// 深拷贝的方法有几种 这里只写一种 (JSON.stringify、jquery等)
function clone(obj) {
  let result = obj.constructor === Array ? [] : {};
  if (typeof obj !== 'object') {
    return obj;
  }
  for (const x in obj) {
    if (obj.hasOwnProperty(x)) {
      if (typeof obj[x] === 'object' && obj[x] !== null) {
        result[x] = clone(obj[x]);   //递归复制
      } else {
        result[x] = obj[x];
      }
    }
  }
  return result
}

let a = [{ name: '张三' }],
  b = clone(a)

console.log(a); // [ { name: '张三' } ]
console.log(b); // [ { name: '张三' } ]
// 成功复制
// 修改b的值
b[0].name = '李四'
console.log(a); // [ { name: '张三' } ]
console.log(b); // [ { name: '李四' } ]
  • 还是上个图


    9419407-efe13a61709541e3.png
    9419407-47e577f9b52cb1c7.png

从图上我们可以看到 b 复制 a 是在 堆内存中复制了一个生成了一个新的,所以我们修改b 的值的时候 a 不会受影响,这样我们就得到了一个新的b 达到了深拷贝的效果!

相关文章

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • js浅拷贝深拷贝

    js浅拷贝,深拷贝的简单实现 基础数据 浅拷贝 深拷贝

  • 浅拷贝和深拷贝

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

  • JS实现深拷贝、instanceof、判断是否为数组

    JS深拷贝 JS中拷贝对象可以按照拷贝的程度可以分为浅拷贝和深拷贝,有些时候我们需要拷贝之后的对象和拷贝之前的对象...

  • JS中对象的复制

    JS中的对象复制分为两种情况:深拷贝和浅拷贝。深拷贝和浅拷贝的区别在于对数组和对象的拷贝,对它们拷贝时浅拷贝只是拷...

  • java中的深拷贝和浅拷贝

    简单记录一下java中的深拷贝和浅拷贝,深拷贝和浅拷贝只是针对对象而言的. 1 深拷贝代码 2 浅拷贝代码 3 测...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • 通过jQuery中.extend()方法理解深拷贝

    所谓深拷贝和浅拷贝最大的区别就是js中有简单类型和引用类型的区分,对于简单类型不存在深拷贝和浅拷贝的区分,对于引用...

  • 2020前端高频面试题总结(附答案)

    [ js基础题 ] 1. new的实现原理是什么? 2. 深拷贝和浅拷贝的区别是什么 深拷贝 浅拷贝 3. bin...

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

网友评论

      本文标题:记录一次JS 的浅拷贝和深拷贝

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