1.可计算属性名
使用方括号表示该属性名称是可计算的,它的内容将被求值并被最终转化为一个字符串。如:
var suffix = " name";
var person = {
["first" + suffix]: "Nicolas",
["last" + suffix]: "Zakas"
};
console.log(person["first name"]); // "Nicolas"
console.log(person["last name"]); // "Zakas"
2.Object.is()
当比较两个值时,= =(相等运算符)、===(全等运算符,避免触发强制类型转换)并不一定完全准确,,如:
console.log(+0 == -0); // true
console.log(+0 === -0); // true
console.log(Object.is(+0, -0); // false
console.log(NaN == NaN); // false
console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); // true
Object.is()方法大部分情况与===运算符相同。
3.属性枚举顺序
对象的自由属性被枚举时的返回顺序影响Object.getOwnPropertyNames()方法及Reflect.ownKeys返回属性的方式,Object.assign处理属性的顺序也将随之改变。基本规则:
- 所有数字键按升序排序。
- 所有字符串键按照被加入对象的顺序排序。
- 所有symbol键按照被加入对象的顺序排序。
var obj = {
a: 1,
0: 1,
c: 1,
2: 1,
b: 1,
1: 1
};
obj.d = 1;
console.log(Object.getOwnPropertyNames(obj).join("")); // "012acbd"
4.原型访问
调用Object.getPrototypeOf()返回储存在其中的值,调用Object.setPrototypeOf()改变其中的值。可以用super访问,super引用相当于指向对象原型的指针。
let person = {
getGreeting() {
return "Hello";
}
}
// 以person对象为原型
let friend = {
getGreeting() {
return super.getGreeting() + ", hi!";
}
}
Object.setPrototypeOf(friend, person);
// 原型是friend
let relative = Object.create(friend);
console.log(person.getGreeting()); // "Hello"
console.log(friend.getGreeting()); // "Hello, hi!"
console.log(relative.getGreeting()); // "Hello, hi!"
super引用不是动态化的,它总是指向正确的对象,无论有多少其他的方法继承了getGreeting方法,super.getGreeting()始终指向person.getGreeting()。