美文网首页
javascript深拷贝和浅拷贝

javascript深拷贝和浅拷贝

作者: 年轻小子 | 来源:发表于2017-08-25 10:33 被阅读0次

首先深复制和浅复制只针对像 Object, Array 这样的复杂对象的。简单来说,浅复制只复制一层对象的属性,而深复制则递归复制了所有层级。

一、数组的slice()和concat()方法

var arr = [1, 2, {a: 1}]
var arr1 = arr.slice()
arr1[2].a = 10
console.log(arr[2].a)    // 10

var arr = [1, 2, {a: 1}];
var arr1 = [];
arr1 = arr1.concat(arr);
arr1[2].a = 10;
console.log(arr[2].a);  //10

从上面的代码可以看出当改变 ‘arr1’ 中的值时,arr也随着改变,所以数组的slice()和concat()的方法为浅拷贝

二、json的api方法

 var json = {a:12,b:5, c: {d: 90}};
 var str = JSON.stringify(json);  //这里将json内的数据转换成一个字符串存起来
 var json2 = JSON.parse(str);  //这里将字符串的内容"还原"成原来的"面目"
 json2.c.d = 100;
 console.log(json.c.d);  //输出 90

可以看出json的api方法是深拷贝,但有一点需要注意,当对象中有函数的话,拷贝出来的话会是undefined, 例子如下:

 var  json = {a: 12, b: 5, c: function() { console.log(10) }}
 var str = JSON.stringify(json);
 var json2 = JSON.parse(str);
 console.log(json2.c)   //undefined  

三、实现深拷贝和浅拷贝

1、浅拷贝

     var shallowCopy = function(Obj) {
        if(typeof Obj !== 'object') {
          return
        }
        var newObj = Obj instanceof Array ? [] : {};  将新数组或新的对象初始化为空
        for(var val in Obj) {
          if(Obj.hasOwnProperty(val)){   // 判断属性是否为自身属性
            newObj[val] = Obj[val];
          }
        }
        return newObj
     }

   var obj = {a: 1, b: 2, c: 3}
   console.log(shallowCopy(obj))

2、深拷贝

     var deepCopy = function(Obj) {
        if(typeof Obj !== 'object') {
          return
        }
        var newObj = Obj instanceof Array ? [] : {};
        for(var val in Obj) {
          if(Obj.hasOwnProperty(val)){
            newObj[val] = typeof Obj[val] === 'object' ? deepCopy(Obj[val]) : Obj[val] //递归便利数组和对象
          }
        }
        return newObj
     }

   var obj = {a: 1, b: 2, c: {d: 9}}
   deepCopy(obj)

相关文章

  • 浅拷贝和深拷贝

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

  • 深入理解JavaScript中的堆与栈 、浅拷贝与深拷贝

    JavaScript中的浅拷贝与深拷贝 学了这么长时间的JavaScript想必大家对浅拷贝和深拷贝还不太熟悉吧,...

  • js浅拷贝和深拷贝

    javaScript的变量类型 javaScript的变量类型基本类型:引用类型: 浅拷贝和深拷贝的区分 浅拷贝浅...

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

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

  • JavaScript深拷贝、浅拷贝

    JavaScript深拷贝、浅拷贝 浅拷贝:浅拷贝只是复制了内存地址,如果原地址中的对象改变了,浅拷贝出来的对象也...

  • 初探浅拷贝&深拷贝

    思考 这个代码为什么具有深拷贝作用 浅拷贝与深拷贝 在JavaScript中,对于Object和Array这类引用...

  • 理解JavaScript中浅拷贝和深拷贝的区别

    要理解 JavaScript中浅拷贝和深拷贝的区别,首先要明白JavaScript的数据类型 JavaScript...

  • 浅拷贝和深拷贝

    今天来讨论一下javascript中的浅拷贝和深拷贝。 首先我们先来看一下两个问题: 1.什么叫浅拷贝和深拷贝? ...

  • iOS面试题-第二页

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

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

网友评论

      本文标题:javascript深拷贝和浅拷贝

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