美文网首页
javascript如何实现对象的深拷贝

javascript如何实现对象的深拷贝

作者: only_tony | 来源:发表于2019-02-27 22:48 被阅读0次

    javascript语言中数据类型一共分为两大类:一是基本数据类型;而是复杂数据类型。基本数据类型包括:String,Number,Boolean,Null,Undefined Symbol(es6新增);复杂数据类型包括:Object。而其他引用类型(Date,Array,Regexp,Function)和基本包装类型(String,Number,Boolean),Math等都属于Object对象的实例对象。因此都可以继承Object原型对象上面属性和方法。

    对于基本数据类型来讲,复制一个变量,等同于拷贝了一份原来变量的值,而原来变量的值的改变不会影响新的变量,而新的变量的改变同样不会影响到原来的变量。例如:

    
    var a = 4; 
    
    var b = a;
    
    a = 5;
    
    console.log(b);  //4
    
    

    对于复杂数据类型来讲,变量只是指向这个对象的指针,当把一个对象变量赋值给另外一个变量的时候,其实是将指向这个对象的指针赋值给了他,这时两个变量都指向同一个对象,因此一个变量的改变会影响到另一个变量。同理所有引用数据类型(Array,Date,Regexp,Function)也是一样。比如:

    var obj = {
      name:'Tony',
      age:'18'
    }
    var copyObj = obj;
    copyObj.name='Lily';
    console.log(obj.name); //Lily
    obj.age=100;
    console.log(copyObj.age); //100
    

    ******那么如何实现对象的浅拷贝呢?*******

    es6为Object对象新增一个方法Object.assign(target, source1, source2)。第一个参数是目标对象,后面的是源对象。这个方法会把源对象上面的可枚举属性拷贝到目标对象上。但是这种拷贝属于浅拷贝。比如:

    var target = {
      name:'Tony',
      age:18
    }
    var source = {
        name:'Lily',
        sex:'male'
    }
    var newObj = Object.assign(target,source);
    console.log(newObj); // {name: "Lily", age: 18, sex: "male"}
    

    注意:
    1,如果源对象与目标对象或者源对象之间存在同名属性,则后面的会覆盖前面的。
    2,如果源对象作为第一个参数,那么会将源对象的值改变成拷贝后的值,也就是会改变源对象。如果不想改变源对象的值,第一个参数可以给一个空对象{},然后取Object.assign的返回值(也就是拷贝后的值)。

    ******对象的深拷贝*******
    对象的深拷贝可以通过JSON对象的两个方法,一是转换js对象转成字符串对象的JSON.stringify方法,另一个是将js字符串对象转换成js对象的JSON.parse方法。

    var obj = {
      name:'Tony',
      age:18
    }
    var copy = JSON.parse(JSON.stringify(obj));
    obj.name='Lily';
    console.log(copy.name); //Tony
    console.log(obj.name); // Lily
    

    使用这种方式实现深复制有一个缺点就是必须给JSON.parse方法传入的字符串必须是合法的JSON,否则会抛出错误

    相关文章

      网友评论

          本文标题:javascript如何实现对象的深拷贝

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