Object.assign()
是什么
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。
tip:
可枚举的属性:
ECMA-262使用一些内部特性来描述属性的特征。这些特性是由维js实现引擎的规范定义的,因此,开发者不能在js直接访问这些特性,为了将某个特性标识为内部特性,规范会用两个中括号把特性的名称括起来,比如[[Enumable]]
属性分两种:
数据属性:
- [[Configurable]]:表示属性是否通过delete删除并且重新定义,是否可以修改它的特性,以及是否可以把它改为访问器属性。
- [[Enumerable]] : 表示属性是否可以通过for in循环返回,默认形况下,该属性为true
- [[Writable]]: 表示属性的值是否可以被修改
- [[Value]]:包含属性的值,这个值默认是undefined
访问器属性:
- [[Configurable]]: 表示属性是否通过delete删除并且重新定义,是否可以修改它的特性,以及是否可以把它改为访问器属性。
- [[Enumerable]] : 表示属性是否可以通过for in循环返回
- [[Get]]: 获取函数,在读取属性时调用,默认值为undefined
- [[Set]]: 设置函数, 在写入属性时调用,默认值为undefined
语法
Object.assign(target,...source)
基本类型
基本类型:只有字符串的包装对象才可能有自身可枚举属性
let a = null; // null会被忽略
let b = undefined; // undefined会被忽略
let c = 'abd'; // 转换成相应的对象类型 String(c)
let d = 0; // Number(d)
let e = true; // Boolean(e)
let objB = Object.assign({},a,b,c,d,e);
// objB ={0:a,1:b,2:d}
let target = {a:1};
let source = {b:2,a:4};
let obj = Object.assign(target,source);
// obj = {a:4,b:2}
对象类型
假如源值是一个对象的引用,它仅仅会复制其引用值
let temp ={a:1, b:{b1:4}};
let obj = Object.assign({},temp);
obj.a = 3;
obj.b.b1 = 0; //只赋值引用值
// temp ={a:1,b:{b1:0}}
所以,用Object.assign()不能进行深拷贝
Object.assign()是一种尽力而为,只会完成部分复制的方法,如果赋值期间出错,则操作会中止并退出,同时退出抛出错误。
const target = Object.defineProperty({},"name",{writable:false ,value: "le"});
Object.assign(target,{a:1},{name:3},{d: 2});
异常:
Uncaught TypeError: Cannot assign to read only property 'name' of object '#<Object>'
结果:
// target = {a:1,name:"le"} name不可修改,assign无法赋值后面的{d:2}