Object.assign()
Object.assign()
方法用于将所有可枚举属性
的值从一个或多个源对象分配到目标对象。它将返回目标对象。
那什么是可枚举的变量: 你可以理解为可以用 for…in…遍历的变量。就是enumerable:true 时的变量
注意几点:
- 首先它是拷贝可迭代的对象。如:
String
,Object
以及可枚举的Symbol
- 拷贝的源对象,到目标对象时,同样的key,目标对象key的值会被源对象覆盖
- 它并不是一个深拷贝,可枚举属性的值包含其他引用类型的对象,指针还是共同的指着这个对象。
看几个例子
(1) 覆盖
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target);
// expected output: Object { a: 1, b: 4, c: 5 }
console.log(returnedTarget);
// expected output: Object { a: 1, b: 4, c: 5 }
(2) 针对深拷贝,需要使用其他办法,因为 Object.assign()拷贝的是(可枚举)属性值。
const log = console.log;
let obj1 = { a: 0 , b: { c: 0}};
let obj2 = Object.assign({}, obj1);
obj1.a = 1;
log(JSON.stringify(obj1));
// { a: 1, b: { c: 0}}
log(JSON.stringify(obj2));
// { a: 0, b: { c: 0}}
obj2.b.c = 3; // b是一个引用对象
log(JSON.stringify(obj1));
// { a: 0, b: { c: 3}}
log(JSON.stringify(obj2));
// { a: 0, b: { c: 3}}
(3)不可枚举的属性变量 无法拷贝
const v1 = "abc";
const v2 = true;
const v3 = 10;
const v4 = Symbol("foo")
const obj = Object.assign({}, v1, null, v2, undefined, v3, v4);
// 原始类型会被包装,null 和 undefined 会被忽略。
// 注意,只有字符串的包装对象才可能有自身可枚举属性。
console.log(obj); // { "0": "a", "1": "b", "2": "c" }