ES8(ECMAScript 2017)引入了一些对 Object
对象的有用方法扩展,这些方法使得操作 JavaScript 对象更加方便和直观。主要扩展的方法有:Object.values()
、Object.keys()
、Object.entries()
和 Object.getOwnPropertyDescriptors()
。
1. Object.values()
1.1 用法
Object.values()
方法返回一个给定对象的所有 可枚举属性的值 的数组。这个方法对对象的属性进行遍历,返回属性值的数组。
const obj = { a: 1, b: 2, c: 3 };
const values = Object.values(obj);
console.log(values); // [1, 2, 3]
- 参数:接受一个对象作为参数。
- 返回值:返回一个数组,包含对象的所有可枚举属性的值。
1.2 使用场景
Object.values() 常用于当你只关心对象的值时,特别是在处理对象数据时,可以快速获得所有属性值,简化了遍历过程。
const person = { name: 'John', age: 30, job: 'Developer' };
// 获取所有属性值
const values = Object.values(person);
console.log(values); // ['John', 30, 'Developer']
// 例如,判断某些值是否符合条件
const hasAgeAbove25 = Object.values(person).some(value => value > 25);
console.log(hasAgeAbove25); // true
2. Object.keys()
2.1 用法
Object.keys() 方法返回一个给定对象的 可枚举属性的名称(即键)的数组。该方法的返回数组中的元素为字符串类型。
const obj = { a: 1, b: 2, c: 3 };
const keys = Object.keys(obj);
console.log(keys); // ['a', 'b', 'c']
- 参数:接受一个对象作为参数。
- 返回值:返回一个数组,包含对象的所有可枚举属性的名称(键)。
2.2 使用场景
Object.keys() 方法常用于获取对象的所有属性名,适用于遍历对象的属性、查找特定属性等场景。
const person = { name: 'Alice', age: 25, job: 'Engineer' };
// 获取所有属性名称
const keys = Object.keys(person);
console.log(keys); // ['name', 'age', 'job']
// 遍历对象的键
Object.keys(person).forEach(key => {
console.log(`${key}: ${person[key]}`);
});
3. Object.entries()
3.1 用法
Object.entries() 方法返回一个给定对象的所有 可枚举属性的键值对 的数组。每个元素是一个数组,包含键(属性名)和对应的值。
const obj = { a: 1, b: 2, c: 3 };
const entries = Object.entries(obj);
console.log(entries);
// [['a', 1], ['b', 2], ['c', 3]]
- 参数:接受一个对象作为参数。
- 返回值:返回一个二维数组,数组中的每个元素是一个包含键和值的子数组。
3.2 使用场景
Object.entries() 用于需要同时访问对象的键和值的情况。它可以用来遍历对象的所有属性,并且提供了更方便的访问键值对的方式。
const person = { name: 'John', age: 30, job: 'Developer' };
// 获取对象的键值对数组
const entries = Object.entries(person);
console.log(entries); // [['name', 'John'], ['age', 30], ['job', 'Developer']]
// 使用 entries 进行遍历
Object.entries(person).forEach(([key, value]) => {
console.log(`${key}: ${value}`);
});
- 例子:将对象转换为 Map Object.entries() 返回的键值对数组非常适合转换为 Map 对象,因为 Map 也是由键值对构成。
const obj = { a: 1, b: 2, c: 3 };
const map = new Map(Object.entries(obj));
console.log(map); // Map { 'a' => 1, 'b' => 2, 'c' => 3 }
4. Object.getOwnPropertyDescriptors()
4.1 用法
Object.getOwnPropertyDescriptors() 方法返回一个对象,该对象包含了所有 自有属性 的描述符。每个属性的描述符是一个对象,描述了属性的 value、writable、enumerable、configurable 、get 、set 方法等特性。
const obj = { a: 1, b: 2 };
const descriptors = Object.getOwnPropertyDescriptors(obj);
console.log(descriptors);
/*
{
a: { value: 1, writable: true, enumerable: true, configurable: true },
b: { value: 2, writable: true, enumerable: true, configurable: true }
}
*/
- 参数:接受一个对象作为参数。
- 返回值:返回一个对象,其中每个属性描述符包括 value、writable、enumerable 和 configurable。
4.2 使用场景
Object.getOwnPropertyDescriptors() 方法常用于获取对象属性的详细描述信息,特别是在实现对象的复制、冻结或其他类似操作时非常有用。
- 例子:复制对象
- 通过 Object.getOwnPropertyDescriptors() 可以复制一个对象,保留其属性的描述符(包括 getter/setter 等)。
const obj = {
a: 1,
get b() { return this.a + 1; }
};
const descriptors = Object.getOwnPropertyDescriptors(obj);
const newObj = Object.create(Object.getPrototypeOf(obj), descriptors);
console.log(newObj); // { a: 1, b: 2 }
- 例子:冻结对象
- Object.getOwnPropertyDescriptors() 可以结合 Object.defineProperties() 来实现深拷贝或冻结对象等操作。
const person = { name: 'John', age: 30 };
// 获取属性描述符
const descriptors = Object.getOwnPropertyDescriptors(person);
// 创建一个新的对象,保留属性描述符,且不可修改
const newPerson = Object.create(Object.getPrototypeOf(person), descriptors);
Object.freeze(newPerson); // 冻结对象
console.log(Object.isFrozen(newPerson)); // true
5. 总结
Object.values()
- 返回对象所有属性的值,适用于只关心对象的值的场景。
- 常用于查找符合条件的值,或者进行统计等操作。 Object.keys()
- 返回对象所有属性的名称,适用于遍历对象的属性名。
- 常用于枚举属性,或者获取属性名进行其他处理。 Object.entries()
- 返回对象所有属性的键值对,适用于同时需要键和值的场景。
- 可与 Map 等结构结合使用,简化代码。 Object.getOwnPropertyDescriptors()
- 获取对象的属性描述符,适用于需要操作对象的属性特性时。Object.asign()只会复制对象的属性,描述符静态方法等不会被复制
- 可用于对象的深拷贝、冻结、保护等复杂操作。 这些方法使得 JavaScript 在操作对象时变得更加简洁和灵活,能够帮助开发者更高效地进行数据处理和属性操作。通过合理使用这些方法,可以显著提高代码的可读性和维护性。