深浅拷贝

2019-02-27  本文已影响0人  写给猫

1 定义

深拷贝:拷贝一个对象时,不仅把对象的引用进行复制,还把该对象引用的值也一起拷贝。这样得到的深拷贝后的拷贝对象和源对象相互独立。
浅拷贝:拷贝一个对象时,仅拷贝对象的引用,拷贝对象和源对象还是引用通一份实体。两者的改变相互影响。

2 js深拷贝

Object.assign()
只能实现对一维对象的深拷贝

var obj1={x:1,y:2};
var obj2=Object.assign({},obj1);
obj2.x=2;
console.log(obj1) //{x: 1, y: 2}
console.log(obj2) //{x: 2, y: 2}

对多维或一维更深的层次的对象只能进行浅拷贝

var obj1={
      x:1,
      y:{m:1}
};
var obj2=Object.assign({},obj1);
obj2.y.m=2;
console.log(obj1) //{x: 1, y: {m: 2}}
console.log(obj2) //{x: 2, y: {m: 2}}

JSON.parse(JSON.stringify(obj))
可实现多维对象的深拷贝,但会忽略undefined、任意的函数、symbol 值

var obj1 = {
    x: 1, 
    y: {
        m: 1
    },
    a:undefined,
    b:function(a,b){
      return a+b
    },
    c:Symbol("foo")
};
var obj2 = JSON.parse(JSON.stringify(obj1));
console.log(obj1) //{x: 1, y: {m: 1}, a: undefined, b: ƒ, c: Symbol(foo)}
console.log(obj2) //{x: 1, y: {m: 1}}
obj2.y.m = 2; //修改obj2.y.m
console.log(obj1) //{x: 1, y: {m: 1}, a: undefined, b: ƒ, c: Symbol(foo)}
console.log(obj2) //{x: 2, y: {m: 2}}

进行JSON.stringify()序列化的过程中,undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。

上一篇下一篇

猜你喜欢

热点阅读