码迷,mamicode.com
首页 > 其他好文 > 详细

深拷贝与浅拷贝

时间:2017-09-12 13:32:46      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:lin   typeof   json格式   改变   stringfy   color   end   images   结果   

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;
}
 
??你已经懂了??。
 

 

深拷贝与浅拷贝

标签:lin   typeof   json格式   改变   stringfy   color   end   images   结果   

原文地址:http://www.cnblogs.com/sunweinan/p/7509215.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!