继之前探讨的对象解构、字面量增强、方法简写和 Object.assign 之后,ES6 还为 Object 对象本身引入了一系列新的静态方法。这些方法提供了更多操作对象的工具,使得对象处理更加高效和方便。
Object 新增方法
1. Object.is()
Object.is() 方法用于比较两个值是否相同。它类似于严格比较(===),但对于某些特殊情况处理更为准确。
console.log(Object.is('foo', 'foo')); // 输出: true
console.log(Object.is(window, window)); // 输出: true
console.log(Object.is('foo', 'bar')); // 输出: false
console.log(Object.is([], [])); // 输出: false
console.log(Object.is(NaN, NaN)); // 输出: true
console.log(Object.is(0, -0)); // 输出: false
2. Object.setPrototypeOf()
Object.setPrototypeOf() 方法设置一个指定的对象的原型(即, 内部 [[Prototype]] 属性)到另一个对象或 null。
let obj = { a: 1 };
let proto = { b: 2 };
Object.setPrototypeOf(obj, proto);
console.log(obj.b); // 输出: 2
3. Object.getOwnPropertySymbols()
返回一个给定对象自身的所有 Symbol 属性的数组。
let obj = {};
let a = Symbol('a');
let b = Symbol.for('b');
obj[a] = 'localSymbol';
obj[b] = 'globalSymbol';
let objectSymbols = Object.getOwnPropertySymbols(obj);
console.log(objectSymbols.length); // 输出: 2
4. Object.keys(), Object.values(), Object.entries()
Object.keys()返回一个对象的所有可枚举属性的字符串数组。Object.values()返回一个给定对象自身的所有可枚举属性值的数组。Object.entries()返回一个给定对象自身的所有可枚举字符串-键值对的数组。
let obj = { a: 1, b: 2, c: 3 };
console.log(Object.keys(obj)); // 输出: ['a', 'b', 'c']
console.log(Object.values(obj)); // 输出: [1, 2, 3]
console.log(Object.entries(obj)); // 输出: [['a', 1], ['b', 2], ['c', 3]]
使用场景
- 值比较:使用
Object.is()进行精确的值比较。 - 改变原型:使用
Object.setPrototypeOf()来改变对象的原型链。 - 处理 Symbol 属性:通过
Object.getOwnPropertySymbols()获取对象的 Symbol 属性。 - 对象属性遍历:利用
Object.keys(),Object.values(),Object.entries()进行对象属性的遍历和操作。
注意事项
- 虽然
Object.setPrototypeOf()可以改变对象的原型,但由于性能原因,不推荐在热路径代码中使用。 Object.is()在大多数情况下与===相同,但对于 NaN 和 +0/-0 的处理更为准确。
通过这些新增的 Object 方法,ES6 在对象操作上提供了更多的可能性,使得处理复杂对象变得更加容易和安全。在接下来的文章中,我们将继续探讨 ES6 中其他关于对象的新特性和方法。