基础语法
Object.assign(目标对象,要复制的对象1,要复制的对象2…);
执行完成后返回目标对象
var o = {a : 1};
var o1 = Object.assign({}, o);
console.log(o1); // {a: 1}
特点
1、多个对象复制时,相同属性后面的会覆盖前面的。
var o = {a : 1};
var o1 = { b: 2 };
var o2 = { c: 3 };
var o3 = { a: 5, c: 6 };
var obj = {};
Object.assign(obj, o, o1, o2, o3);
console.log(obj); //{a: 5, b: 2, c: 6}
2、仅复制自身的属性和方法,原型链上的属性和方法不复制
var o0 = { a: 1 };
var o = Object.create(o0);
var o1 = { b: 2 };
var o2 = { c: 3 };
var obj = {};
Object.assign(obj, o, o1, o2);
console.log(obj); //{b: 2, c: 3}
3、不可枚举属性不能复制(Symbol是可以复制的)
var o0 = { a: 1 };
var o = Object.create(o0);
var o1 = { b: 2 };
var o2 = { c: 3 };
var c = Symbol();
o2[c] = 100;
var obj = {};
var o3 = { a: 5, c: 6 };
Object.assign(obj, o, o1, o2, o3);
for (var prop in obj) {
console.log(prop); //b c a
}
console.log(obj); //{b: 2, c: 6, a: 5, Symbol(): 100}
4、非引用型变量(比如数值、字符串、布尔值等)因为没有对象属性,因此使用Object.assign()无效。
5、某些[[]]属性都是不能复制的,比如Set和Map类型。
var map = new Map();
map.set("name", "xiaola");
map.set("age", 20);
var o = new Map();
Object.assign(o, map);
console.log(o, map);
打印结果如图:
Entries是[[]]属性,所以不能复制成功。