zoukankan      html  css  js  c++  java
  • javaScript 深拷贝

      一般我们用到的拷贝大部分都是这样的,比如定义一个变量  var a=10,然后将a的值赋值给变量b,这个属于值的拷贝。

      下面我们聊聊数组和对象的拷贝。大家都知道数组和对象都属于引用类型,所以在将一个数组(或对象)赋值给另外一个数组(或对象)的时候,其实传递的是引用的地址。如果我们改变其中一个数组(或对象)的属性或方法时,另外一个也会跟着变化。也就是我们所说的——浅拷贝。代码如下:

         var obj1 = {
                name:'Awen',
                song:{
                    author:'赵雷',
                    word:'zhaolei'
                },
                geshou:["yigeren",2,3,4]
            };
            var obj2;
            obj2 = obj1;
            obj2.geshou.push('我是新成员');
            console.log(obj1);
            //geshou:Array[5] ==>  ["yigeren",2,3,4,"我是新成员"]
    
            console.log(obj2);
            //geshou:Array[5] ==>  ["yigeren",2,3,4,"我是新成员"]

      然而,如果我们不想改变原对象(即obj1)中的数据,该怎么办呢?接下来就要用到另外一个知识——深拷贝。深拷贝会另外单独开辟一块内存空间用于存储新对象(或数组),从而让两者除了数据一样外没有任何关系。代码如下:(仅供参考)

    function deepCopy(real,copy){
                var copy = copy||{};
                for(var k in real){
                    if(typeof real[k]==='object'){
                        //如果copy[k]是数组  则返回数组  如果是对象则返回一个空的对象  然后继续调用 deepCopy
                        copy[k]=Array.isArray(real[k])?[]:{};  //方法一:利用数组的方法检测
                       // copy[k]=(real[k].constructor===Array)?[]:{};  //方法二:用对象的方法检测
    
                        //递归处理(两种方法)
                        // deepCopy(real[k],copy[k]);//递归第一种方法:直接调用方法
                        arguments.callee(real[k],copy[k]);//第二种:利用argument.callee方法递归调用
                    }else{
                        copy[k] = real[k];  
                    }
                    
                }
                return copy;
            }
    

      定义一个深拷方法deepCopy,real是源对象; copy是一个新变量,接受拷贝的内容。最后返回copy对象。

  • 相关阅读:
    智慧出行--maas
    hystrix动态修改参数
    hystrix元素详解
    hystrix讲解:熔断降级隔离以及合并请求
    幂等性概念
    设计模式之Command
    Unity AssetBundle工作流
    unity share current game screen
    `Facebook.Unity.Settings' has already been imported error solution
    IOException: win32 io returned 267. Path:
  • 原文地址:https://www.cnblogs.com/zhaoliu100125/p/6515644.html
Copyright © 2011-2022 走看看