首页 > web前端 > js教程 > 正文

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

星降
发布: 2025-08-03 11:26:01
原创
1050人浏览过

使用 object.keys(obj) 获取对象自身所有可枚举属性的键名;2. 使用 object.getownpropertynames(obj) 获取对象自身所有属性(包括不可枚举)的键名;3. 使用 for...in 循环结合 hasownproperty() 遍历对象自身的可枚举属性;4. 结合 object.getprototypeof() 与递归获取对象及其原型链上所有可枚举的键名;5. 使用 object.getownpropertysymbols() 获取 symbol 类型的键名;6. 使用 in 操作符判断属性是否存在于对象或其原型链中,使用 hasownproperty() 判断属性是否为对象自身的属性。这些方法可根据具体需求选择使用,以准确获取或判断对象的键名。

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

获取 JavaScript 对象的所有 key,最直接的方法就是使用

Object.keys()
登录后复制
。它会返回一个包含对象所有可枚举属性名的数组。但有时,你可能需要考虑原型链上的属性,或者只想获取特定类型的 key。

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

Object.keys() 是最常用的方法,但还有一些其他的选择,取决于你的具体需求。

解决方案(直接输出解决方案即可)

  1. Object.keys(obj)
    登录后复制
    : 这是最简单直接的方法。它返回一个数组,包含
    obj
    登录后复制
    对象自身所有可枚举属性的键名。

    js中怎样获取对象的key列表
    const myObject = {
      name: 'Alice',
      age: 30,
      city: 'New York'
    };
    
    const keys = Object.keys(myObject);
    console.log(keys); // 输出: ["name", "age", "city"]
    登录后复制
  2. Object.getOwnPropertyNames(obj)
    登录后复制
    : 这个方法会返回一个数组,包含
    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()
    登录后复制
    方法来过滤掉原型链上的属性,只保留对象自身的属性。

    js中怎样获取对象的key列表
    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()
    登录后复制
    递归获取所有 key
    : 如果你需要获取对象及其原型链上所有可枚举的 key,可以结合使用
    Object.getPrototypeOf()
    登录后复制
    Object.keys()
    登录后复制
    进行递归。

    壁纸样机神器
    壁纸样机神器

    免费壁纸样机生成

    壁纸样机神器 0
    查看详情 壁纸样机神器
    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"]
    登录后复制

如何处理 Symbol 类型的 key?

Object.keys()
登录后复制
Object.getOwnPropertyNames()
登录后复制
都不会返回 Symbol 类型的 key。要获取 Symbol 类型的 key,你需要使用
Object.getOwnPropertySymbols()
登录后复制
方法。

const myObject = {
  [Symbol('mySymbol')]: 'symbolValue',
  name: 'Alice'
};

const symbolKeys = Object.getOwnPropertySymbols(myObject);
console.log(symbolKeys); // 输出: [Symbol(mySymbol)]
登录后复制

如果你想同时获取字符串类型的 key 和 Symbol 类型的 key,可以结合使用

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)]
登录后复制

性能考量:Object.keys() vs. for...in

通常来说,

Object.keys()
登录后复制
for...in
登录后复制
循环更快,因为它不需要遍历原型链,而且现代 JavaScript 引擎对
Object.keys()
登录后复制
做了优化。 但是,如果你的目标是遍历对象的所有可枚举属性(包括原型链上的),那么
for...in
登录后复制
循环仍然是一个合适的选择。 关键在于,用
hasOwnProperty()
登录后复制
过滤掉不属于对象自身的属性。

const obj = { a: 1, b: 2 };
const proto = { c: 3 };
Object.setPrototypeOf(obj, proto);

// Object.keys()
console.time('Object.keys');
Object.keys(obj); // 只返回 obj 自身的属性
console.timeEnd('Object.keys');

// for...in
console.time('for...in');
for (let key in obj) {
  // 这里没有使用 hasOwnProperty,所以会遍历原型链上的属性
}
console.timeEnd('for...in');

console.time('for...in with hasOwnProperty');
for (let key in obj) {
  if (obj.hasOwnProperty(key)) { // 只返回 obj 自身的属性
  }
}
console.timeEnd('for...in with hasOwnProperty');
登录后复制

如何判断一个 key 是否存在于对象中?

有时候,你可能不是要获取所有的 key,而是要判断一个特定的 key 是否存在于对象中。 这时,可以使用

in
登录后复制
操作符或者
hasOwnProperty()
登录后复制
方法。

  • in
    登录后复制
    操作符: 如果指定的属性在对象或其原型链中,则
    in
    登录后复制
    操作符返回
    true
    登录后复制

    const myObject = {
      name: 'Alice'
    };
    
    console.log('name' in myObject); // 输出: true
    console.log('toString' in myObject); // 输出: true (toString 是 Object 原型上的属性)
    登录后复制
  • hasOwnProperty()
    登录后复制
    方法: 如果指定的属性是对象自身的属性,而不是继承来的,则
    hasOwnProperty()
    登录后复制
    方法返回
    true
    登录后复制

    const myObject = {
      name: 'Alice'
    };
    
    console.log(myObject.hasOwnProperty('name')); // 输出: true
    console.log(myObject.hasOwnProperty('toString')); // 输出: false
    登录后复制

以上就是js中怎样获取对象的key列表的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号