Object 也新增了些 API。
一. Object.is(…)
Object.is(…) 执行比 ===(严格等于) 更加严格的值比较。它调用的是底层 SameValue 算法,基本上和严格等于的比较是一样的,它们有两个区别。
var x = NaN, y = 0, z = -0;
x === x; //false
y === z; //true
Object.is(x,x); //true
Object.is(y,z); //false
区别就是:
- “===” 比较 NaN 结果为false,Object.is(…) 结果为 true。
- -0 和 0 , ‘“===” 结果为true,Object.is(…)结果为 false。
二. Object.getOwnPropertySymbols(…)
这个API直接从对象上取得所有符号属性:
var o = {
a:24,
[Symbol("b")]:"2020",
c: true
}
Object.getOwnPropertySymbols(o); // [Symbol(b)]
三. Object.setPrototypeOf(…)
这个API设置对象的 [[prototype]] 用于行为委托:
var obj1 = {
print:function(){console.log('2020')}
}
var obj2 = {}
Object.setPrototypeOf(obj2,obj1)
obj2.print(); // 2020
它和设置字面值对象中的 --proto-- 一样,通常在对象创建之后立刻使用,这样代码会更加清晰,不容易出错。
四. Object.assign(…)
这个API把一个对象的属性复制和混合到另一个对象中去。第一个参数是目标对象,其他传入的参数都是源。源会按照传入的顺序依次排列。对于每一个源,它的可枚举和自己拥有的键值,包括符号都会被通过 = 复制到目标对象,然后返回目标对象。
特点:
- 继承的属性不会被复制。
- 不可枚举的属性不会被复制,不可枚举的符号同样也不可以被复制。
- 只读属性被复制会被作为一个普通属性赋值,复制之后不会是只读属性。
它还可以链接一个对象的原型链,例:
var obj1 = {a(){console.log('2020')}};
var obj2 = Object.assign(Object.create(obj1));
obj2.a(); // 2020