zoukankan      html  css  js  c++  java
  • 对象的深浅拷贝

    js是一门弱类型语言,ECMAScript指出数据类型主要:基本类型值和引用类型值。基本类型值指的是简单的数据段;引用类型值指由多个值构成的对象。当我们把变量赋值给一个变量时,解析器首先要做的就是确认这个值是基本类型值还是引用类型值。

    在看具体分类之前需要明确:js只能操控栈,不能操控堆(是否是这么说?)

    基本数据类型有以下几种:

    number,string,boolean,undefined,null 这五种

    基本数据类型可以直接操作保存在变量中的实际值,当变量本身发生变化时不对拷贝值造成影响。也就是直接在栈中操作。

    如:

    var a = 10;
    var b = a; //b是a的拷贝
    a = 20; //变量a发生变化
    console.log(b);  //10

    引用数据类型:——修改原始引用会对其他应用产生影响

    array,function,object。 这几种引用数据类型,实际上存在于堆中,栈中保留的只是堆中的引用。通过栈中的引用很容易找到堆中保留的原始数据。

    如:

    var obj = {name:"wuya"};
    var obj2 = obj;
    obj.name = "";
    console.log(obj2.name);  //""

    直接赋值的方式就是所谓的浅拷贝。

    如果我们想原始引用不影响拷贝,即所谓的深拷贝,就需要处理下。

    实现一:

    function clone(obj){
        if(typeof obj != obj || obj == null){  //注意:typeof null == 'object'
            return obj;      
        }    
        var temp = obj.constructor();   
        for(var key in obj){
            temp[key] = clone(obj[key]);  
        }
       return temp;
    }
    var obj = {name:"wuya"};
    var obj2 = clone(obj);
    obj.name = '';
    console.log(obj2.name); //wuya

    实现二:

    var bob = {
        name: "Bob",
        age: 32
    };
     
    var bill = (JSON.parse(JSON.stringify(bob)));
    bill.name = "Bill";
     
    console.log(bob);
    console.log(bill);

    如果浏览器不支持JSON.stringify,引入json.org库就行

    参考:

    1.http://heyjavascript.com/4-creative-ways-to-clone-objects/

    2.http://www.cnblogs.com/pigtail/archive/2012/06/29/2569601.html

  • 相关阅读:
    linux
    day01-02
    测试基础
    cookie session
    多表表与表关系 增删改查 admin
    连接数据库 创建表 字段和参数 增删改查
    LeetCode OJ:Triangle(三角形)
    LeetCode OJ:Unique Paths II(唯一路径II)
    LeetCode OJ:Unique Paths(唯一路径)
    使用双栈实现一个队列
  • 原文地址:https://www.cnblogs.com/wuya16/p/3445464.html
Copyright © 2011-2022 走看看