深拷贝与浅拷贝

1.什么是浅拷贝?

开发时会遇到这样的问题,

首先我们有一个对象 var obj1 = {a:1, b:2, c:3,........}(里面内容超多),里面存放了一些原始的数据,因为项目中有好多地方要用到这个数据,所以我不想改变这个obj1。

然后有个地方要用到这样的一个对象obj2 = {a:1, b:20000, c:3........}, 我不想重新写一遍这个数据了,太占地方了,这时候我想到了一个方法,如下代码

var obj1 = {a:1, b:2, c:3,........};

var obj2 = obj1;

obj2.b = 200;

console.log(obj2);  // 得到了想要的数据obj2 = {a:1, b:20000, c:3........}

聪明吧😄,但是我只能说too young too simple

 

在上面代码的基础上 加上代码 console.log(obj1) // 得到结果是 {a:1, b:20000, c:3........}

如图

 

😳这咋回事啊?

嗯,这就是浅拷贝。。

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。

那怎么才能得到我想要的结果啊😭?

用深拷贝呀!

深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象

那怎么实现深拷贝呢?

1.手动复制: 自己在写一遍。(好蠢的方法)

2.Object.assign,ES6 的新函数:var obj2 = Object.assign({}, obj1);(这个好😄)

3.var obj2 = JSON.parse(JSON.stringfy(obj1)) : 

  用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象。
  缺点:只有可以转成JSON格式的对象才可以这样用,像function没办法转成JSON。

4.jquery,中的 $.extend方法可实现深拷贝。

5.递归方法实现

function clone( o ) {
  var temp = {};
  for( var k in o ) {
    if( typeof o[ k ] == 'object' ){
      temp[ k ] = clone( o[ k ] );
    } else {
      temp[ k ] = o[ k ];
    }
  }
  return temp;
}
 
👌你已经懂了😁。
 

 

posted @ 2017-09-12 11:32  sunweinan  阅读(184)  评论(0编辑  收藏  举报