ES6 对象新增特性(第四篇):`Object` 新增方法

77 阅读2分钟

继之前探讨的对象解构、字面量增强、方法简写和 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 中其他关于对象的新特性和方法。