美文网首页JavaScriptweb前端学员笔记
JavaScript篇——对象的深浅拷贝

JavaScript篇——对象的深浅拷贝

作者: 前端开发_Eric | 来源:发表于2019-05-31 16:03 被阅读350次
代码.jpg

我们知道,在JavaScript中复制一个基本类型的值很容易实现,但如果要复制的值是一个引用类型(如Object类型),又是如何实现的呢?今天介绍一下复制对象的方法。

1、对象浅度拷贝

如图:下面声明了一个对象obj1。

var obj1 = {
     name: 'zs',
     age: 18,
     sex: '男',
}
var obj2 = {};
function copy(o1, o2) {
      for (var key in o1) {
      o2[key] = o1[key];
    }
}
copy(obj1, obj2);
// 修改obj1中的成员,obj2不会发生改变
obj1.name = 'lisi';
console.log(obj2.name); // zs

但浅拷贝会遇到一个问题,当待拷贝对象的成员的数据类型为引用类型时,浅拷贝之后,改变原对象中的引用类型成员,新对象也会发生改变。

 var obj1 = {
     name: 'zs',
     age: 18,
     sex: '男',
     dog: {
        name: '金毛',
        age: 2,
        yellow: '黄色'
     }
  }
var obj2 = {};
function copy(o1, o2) {
    for (var key in o1) {
      o2[key] = o1[key];
    }
}
copy(obj1, obj2);
// 修改obj1中的引用类型成员,obj2也会发生改变
obj1.dog.name = '大黄';
console.log(obj2.dog.name);   //大黄

为什么会发生这种现象呢?要明白这一点,首先要理解什么是浅拷贝。
当待拷贝的成员是一个引用类型,如Object类型。在复制该成员时,只是把该成员所指向的对象的地址值复制了一份,让新的变量指向原来的对象。并没有在内存中创建出一个新的对象。

换句话说,浅拷贝把一个对象的成员复制给另一个对象时,只能把第一层的值复制过去,如果该值是个对象,复制的仅仅是该对象的引用。而没有创建一个新的对象。所以改变原对象该值的属性,第二个对象也会发生改变。

2、对象深度拷贝

在进行深度拷贝时,要对对象的成员属性是否为引用类型进行判断,如果是,需要创建一个新的引用类型变量,再遍历要拷贝的引用类型成员,利用递归,直至不再出现引用类型的成员。

<script>
  var obj1 = {
    name: 'zs',
    age: 18,
    sex: '男',
    dog: {
      name: '金毛',
      age: 2
    },
    friends: ['李四', 'ww']
  }
  // 深度拷贝的方法
   function deepCopy(obj) {
        var newObj = obj instanceof Array ? [] : {};
        for (var key in obj) {
            if (typeof obj[key] === 'object') {
                newObj[key] = deepCopy(obj[key]);
            } else {
                newObj[key] = obj[key];
            }
        }
        return newObj
    }
  var obj2 =  deepCopy(obj1) ;

  // 修改obj1中的成员 obj2没有发生改变
  obj1.dog.name = '二哈';
  obj1.friends[0] = '成龙';
  console.log(obj2.dog.name);//金毛
  console.log(obj2.friends[0])//李四
</script>

好的,以上就是我对JavaScript中复制一个引用类型的值的理解,如有错误之处,还望同仁指出。

相关文章

  • JavaScript篇——对象的深浅拷贝

    我们知道,在JavaScript中复制一个基本类型的值很容易实现,但如果要复制的值是一个引用类型(如Object类...

  • JavaScript 对象深浅拷贝

    浅拷贝: 深拷贝:

  • JavaScript对象深浅拷贝

    首先对象属性和方法的简写方法。 Object.assign()Object.assign方法用于对象的合并。当对象...

  • Javascript对象的深浅拷贝

    开门见山,有人叫对象的复制为深复制浅复制,也有人叫深拷贝浅拷贝。其实都是copy。 深拷贝(递归复制,复制所有层级...

  • JavaScript对象的深浅拷贝

    在项目中我们会经常遇到这样的问题,当我把一个对象赋值给另一个新的对象的时候,当我改变其中一个,另一个数据也跟着改变...

  • Python 强化训练:第六篇

    强化训练:第六篇 1. 深浅拷贝:是否是同一个对象,使用id判断是否指向同一个对象, 深浅拷贝,引用区分可变对象和...

  • javascript深浅拷贝

    Javascript有六种基本数据类型(也就是简单数据类型),它们分别是:Undefined,Null,Boole...

  • javascript深浅拷贝

    underscore 的源码中,有很多地方用到了 Array.prototype.slice() 方法,但是并没有...

  • JavaScript深浅拷贝

    简单讲呢,深浅拷贝,都是进行复制,那么区别主要在于复制出来的新对象和原来的对象是否会互相影响,改一个,另一个也会变...

  • Javascript深浅拷贝

    浅拷贝 1.基本数据类型 是存在栈中的,所以=赋值,都会创建一个新的空间,例如 变量b有自己独立的空间 2.对象数...

网友评论

    本文标题:JavaScript篇——对象的深浅拷贝

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