js中怎样获取对象的key列表

js中怎样获取对象的key列表
最新回答
长青诗

2023-03-01 06:25:33

在 JavaScript 中,获取对象键名列表的方法有多种,具体选择取决于是否需要包含不可枚举属性、Symbol 类型键名或原型链上的属性。以下是常见方法及示例:

1. 获取对象自身所有可枚举属性的键名使用 Object.keys(obj),返回一个包含对象自身可枚举属性键名的数组。

const myObject = { name: 'Alice', age: 30, city: 'New York' };const keys = Object.keys(myObject);console.log(keys); // 输出: ["name", "age", "city"]

2. 获取对象自身所有属性(包括不可枚举)的键名使用 Object.getOwnPropertyNames(obj),返回对象自身所有属性的键名数组(包括不可枚举属性)。

const myObject = {};Object.defineProperty(myObject, 'hiddenProperty', { value: 'secret', enumerable: false // 不可枚举});myObject.visibleProperty = 'public';const keys = Object.getOwnPropertyNames(myObject);console.log(keys); // 输出: ["hiddenProperty", "visibleProperty"]

3. 遍历对象自身可枚举属性(需过滤原型链属性)使用 for...in 循环结合 hasOwnProperty() 方法,猜芹遍历对象自身可枚举属性。

const myObject = { name: 'Alice', age: 30 };Object.prototype.greeting = function() { console.log("Hello!"); };const keys = [];for (let key in myObject) { if (myObject.hasOwnProperty(key)) { keys.push(key); }}console.log(keys); // 输出: ["name", "age"]delete Object.prototype.greeting; // 清理原型

4. 递归获取对象及其原型链纤磨上所有可枚举属性的键名结合 Object.getPrototypeOf() 和 Object.keys() 递归遍历原毁兆斗型链。

function getAllKeys(obj) { let keys = Object.keys(obj); let proto = Object.getPrototypeOf(obj); if (proto) { keys = keys.concat(getAllKeys(proto)); } return keys;}const parent = { parentProperty: 'parentValue' };const child = Object.create(parent);child.childProperty = 'childValue';const allKeys = getAllKeys(child);console.log(allKeys); // 输出: ["childProperty", "parentProperty"]

5. 获取 Symbol 类型的键名使用 Object.getOwnPropertySymbols(obj) 获取对象自身的 Symbol 类型键名。

const myObject = { [Symbol('mySymbol')]: 'symbolValue', name: 'Alice' };const symbolKeys = Object.getOwnPropertySymbols(myObject);console.log(symbolKeys); // 输出: [Symbol(mySymbol)]

6. 同时获取字符串键和 Symbol 键结合 Object.keys() 和 Object.getOwnPropertySymbols()。

const myObject = { [Symbol('mySymbol')]: 'symbolValue', name: 'Alice' };const stringKeys = Object.keys(myObject);const symbolKeys = Object.getOwnPropertySymbols(myObject);const allKeys = stringKeys.concat(symbolKeys);console.log(allKeys); // 输出: ["name", Symbol(mySymbol)]

判断属性是否存在的方法

  • in 操作符:检查属性是否在对象或其原型链中。

    const myObject = { name: 'Alice' };console.log('name' in myObject); // 输出: trueconsole.log('toString' in myObject); // 输出: true(继承自原型)
  • hasOwnProperty() 方法:检查属性是否为对象自身所有。

    const myObject = { name: 'Alice' };console.log(myObject.hasOwnProperty('name')); // 输出: trueconsole.log(myObject.hasOwnProperty('toString')); // 输出: false

性能考量

  • Object.keys() 通常比 for...in 更快,因其无需遍历原型链且引擎优化。
  • 若需遍历原型链上的属性,for...in 仍适用,但需用 hasOwnProperty() 过滤。

根据需求选择合适方法,可高效获取或判断对象键名。