ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_数据

ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_深拷贝_02
这些都是es6才有的ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_深拷贝_03

Object.assign

在a加上三个属性 分别是p1\p2\p3
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_数据_04
以前是这么去加
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_数据_05

ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_ES6_06
b的三个属性p1、p2、p3就全部复制到a这个对象上了。
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_ES6_07
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_ES6_08

ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_ES6_09
把后面的东西放到前面的东西上

两个对象都有同一个属性


ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_ES6_10
后面有的重复的会覆盖前面ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_深拷贝_11

多个对象

再来一个c对象。
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_浅拷贝_12
先把b的弄到a上面,再c的弄到a上面。
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_ES6_13

让c也有同样的属性a1 看看会不会覆盖前面的
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_干货_14
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_干货_15

深拷贝还是浅拷贝


ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_数据_16
a=1,
b=a,b的值也是1,把a的数值拷贝到b上。
最终输出的a还是1,a和b是各自的内存存储着自己的值,
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_深拷贝_17


ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_浅拷贝_18
a的值不是对象,是内存中地址的引用。
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_浅拷贝_19

ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_干货_20

ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_干货_21

ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_ES6_22

对于大多数语言来说,深拷贝是不可能的


ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_数据_23
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_数据_24

理论上的深拷贝是把heap里面的内存也复制一份。但是完美的深拷贝是不可能的。我们永远无法知道一个函数内用到了哪些数据,除非看它的源码知道用到了哪些数据。
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_数据_25

Object.assign所有的拷贝都是浅拷贝。

ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_ES6_26

b里面有个obj对象,给a以后。b的obj和a的obj地址是相同的
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_浅拷贝_27
修改了a的obj.name那么b的对象的值也变化了。ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_数据_28

总结

只拷贝可枚举的属性。
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_数据_29


b.toString打印出来对象,toString是不可枚举的
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_干货_30


ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_干货_31
b.b1的值。
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_数据_32
b要有get,a要有set,猜可能拷贝过去。这里知道这么一回事就可以了
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_数据_33

ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_浅拷贝_34


ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_浅拷贝_35


常用的用法是第一个参数是一个空对象,这样就可以接受别的对象的所有属性。
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_深拷贝_36
同样的目的,不一样的写法
ES6深入浅出-11 ES6新增的API(上)-1.Object.assign_ES6_37

我的总结:


1.复制后面的对象属性到前面的,

2.重复属性后面的会覆盖前面的

3.后面对象可以是多个,也就是同时复制多个对象的属性到前面参数第一个对象。

4.null和undefined的属性也会被复制过去。

5.复制对象都是浅拷贝