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

js如何获取对象的键名列表

月夜之吻
发布: 2025-08-16 13:47:01
原创
555人浏览过

获取javascript对象所有键名最直接的方式是使用object.keys(),它返回对象自身可枚举的字符串键名数组;2. 与for...in不同,object.keys()不遍历原型链且不包含不可枚举属性,而for...in会遍历原型链上的可枚举属性,需配合hasownproperty过滤;3. 若需获取属性值或键值对,可分别使用object.values()和object.entries();4. 对于symbol键名,需使用object.getownpropertysymbols()获取;5. 要获取所有键名(包括字符串和symbol,无论可枚举性),应使用reflect.ownkeys(),它返回对象自身的全部属性键名。

js如何获取对象的键名列表

在JavaScript里,获取一个对象的所有键名,最直接和常用的方式就是用

Object.keys()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
。它会给你一个包含所有可枚举字符串键名的数组,这在很多时候都是你想要的。

解决方案

要获取JavaScript对象的键名列表,最常见也最推荐的方法是使用

Object.keys()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
。这个静态方法会返回一个由给定对象自身可枚举属性的字符串键名组成的数组。

举个例子,假设我们有一个用户配置对象:

const userProfile = {
  id: 'user123',
  username: 'coder_xiaoming',
  email: 'xiaoming@example.com',
  isActive: true,
  // 模拟一个不可枚举属性,虽然默认情况下我们创建的属性都是可枚举的
  // 但通过 Object.defineProperty 可以设置
  _secretKey: 'some_hidden_value' // 假设这个是不可枚举的
};

Object.defineProperty(userProfile, '_secretKey', {
  enumerable: false, // 设置为不可枚举
  value: 'some_hidden_value'
});

const keys = Object.keys(userProfile);
console.log(keys); // 输出: ["id", "username", "email", "isActive"]
登录后复制

你看,

_secretKey
登录后复制
这个键名就没有出现在结果里,因为它被明确设置为不可枚举了。这正是
Object.keys()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的特性:它只关心那些“愿意”被外界看到的属性。这对我来说,在处理一些配置或者数据展示的时候特别方便,因为我通常只关心那些需要被遍历或者展示出来的属性。

除了

Object.keys()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,其实还有一些别的办法,比如老派的
for...in
登录后复制
登录后复制
登录后复制
登录后复制
循环,但它会遍历原型链上的属性,并且需要配合
hasOwnProperty
登录后复制
来过滤,用起来就没那么直接了。而如果你需要获取所有属性,包括不可枚举的,那
Object.getOwnPropertyNames()
登录后复制
登录后复制
就派上用场了,但它也只管字符串键名。

Object.keys() 和 for...in 有什么区别,我该用哪个?

这个问题问得特别好,也是初学者经常会混淆的地方。在我看来,理解它们之间的差异,能让你在实际开发中少踩不少坑。

Object.keys()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,我们前面提到了,它只会返回对象自身的、可枚举字符串键名组成的数组。这意味着它不会去“看”原型链上的属性,也不会管那些被标记为不可枚举的属性。它给你的是一个干净的、可以直接操作的数组,非常适合用于迭代或者检查对象的第一层属性。

function Person() {
  this.name = 'Alice';
  this.age = 30;
}

Person.prototype.sayHello = function() {
  console.log('Hello!');
};

const personInstance = new Person();
personInstance.city = 'New York';

const keysFromObjectKeys = Object.keys(personInstance);
console.log(keysFromObjectKeys); // 输出: ["name", "age", "city"]
// sayHello 没有出现,因为它在原型链上
登录后复制

for...in
登录后复制
登录后复制
登录后复制
登录后复制
循环呢,它的行为就有点“热情过头”了。它会遍历对象自身以及原型链上所有可枚举字符串键名。这意味着如果你不加处理,你可能会拿到一些你根本不关心的属性,比如从原型链继承来的方法。

for (let key in personInstance) {
  console.log(key);
}
// 输出:
// name
// age
// city
// sayHello
登录后复制

你看,

sayHello
登录后复制
也出来了。所以,如果你使用
for...in
登录后复制
登录后复制
登录后复制
登录后复制
,几乎总是需要加上一个
if (personInstance.hasOwnProperty(key))
登录后复制
的判断,来确保你只处理对象自身的属性。

那么,到底该用哪个?我的建议是:绝大多数情况下,使用

Object.keys()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
。它更现代、更安全、更直接,返回一个数组也更方便后续的数组操作(比如
map
登录后复制
登录后复制
,
filter
登录后复制
,
forEach
登录后复制
)。
for...in
登录后复制
登录后复制
登录后复制
登录后复制
在某些特定场景下(比如需要遍历原型链上的属性,但这种情况真的很少见)或者在处理一些老旧代码时可能会用到,但作为日常开发,
Object.keys()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
是你的首选。它避免了不必要的复杂性,让代码意图更清晰。

除了键名,我还能怎么获取对象的其他属性信息?

有时候,光知道键名还不够,你可能还需要键对应的值,或者想一次性拿到键和值,甚至更详细的属性描述符。JavaScript为我们提供了几种非常实用的方法来应对这些需求,它们是

Object.values()
登录后复制
登录后复制
登录后复制
Object.entries()
登录后复制
登录后复制
登录后复制
登录后复制

Object.values()
登录后复制
登录后复制
登录后复制
顾名思义,它会返回一个由给定对象自身可枚举属性的组成的数组。这在你想快速获取一个对象所有属性值进行处理时非常有用。

const product = {
  name: 'Laptop',
  price: 1200,
  category: 'Electronics',
  inStock: true
};

const values = Object.values(product);
console.log(values); // 输出: ["Laptop", 1200, "Electronics", true]
登录后复制

这在做数据统计或者生成报告时,我经常会用到,比如统计所有商品的价格,或者检查是否有商品库存不足。

Object.entries()
登录后复制
登录后复制
登录后复制
登录后复制
则更强大,它返回一个由给定对象自身可枚举属性的
[key, value]
登录后复制
对组成的数组。这意味着你一次性拿到了键和值,非常适合需要同时处理这两者的情况。

const settings = {
  theme: 'dark',
  fontSize: '16px',
  language: 'en-US'
};

const entries = Object.entries(settings);
console.log(entries);
/*
输出:
[
  ["theme", "dark"],
  ["fontSize", "16px"],
  ["language", "en-US"]
]
*/
登录后复制

我个人觉得

Object.entries()
登录后复制
登录后复制
登录后复制
登录后复制
在很多场景下都非常灵活,比如当你需要将一个对象转换成
map
登录后复制
登录后复制
对象,或者需要对键值对进行过滤、映射时,它都是一个非常好的起点。结合数组的解构赋值,用起来更是顺手。

如果你想获取更深层次的属性信息,比如属性是否可写、可配置、可枚举等,

Object.getOwnPropertyDescriptor(obj, propName)
登录后复制
或者
Object.getOwnPropertyDescriptors(obj)
登录后复制
会是你的选择。它们返回的是属性的完整描述符对象,这在进行一些高级的元编程或者库开发时会很有用,但日常应用中可能不那么频繁。

处理非标准键名(如Symbol)时,有哪些特别的方法?

在ES6引入

Symbol
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
类型之后,JavaScript对象的键名就不再仅仅是字符串了。
Symbol
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
作为一种独一无二的值,可以作为对象的属性键,而且默认是不可枚举的。这就意味着我们前面提到的
Object.keys()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
Object.values()
登录后复制
登录后复制
登录后复制
Object.entries()
登录后复制
登录后复制
登录后复制
登录后复制
,甚至
Object.getOwnPropertyNames()
登录后复制
登录后复制
都无法获取到它们。

这时候,如果你想获取对象中所有的

Symbol
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
键名,你需要用到
Object.getOwnPropertySymbols()
登录后复制
登录后复制
登录后复制
。这个方法会返回一个数组,包含所有直接在给定对象上找到的
Symbol
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
属性。

const uniqueId = Symbol('id');
const secretData = Symbol('secret');

const myObject = {
  name: 'John Doe',
  [uniqueId]: 'user_abc_123',
  age: 30,
  [secretData]: 'top_secret_info'
};

const stringKeys = Object.keys(myObject);
console.log('字符串键名:', stringKeys); // 输出: 字符串键名: ["name", "age"]

const symbolKeys = Object.getOwnPropertySymbols(myObject);
console.log('Symbol键名:', symbolKeys); // 输出: Symbol键名: [Symbol(id), Symbol(secret)]
登录后复制

你看,通过

Object.getOwnPropertySymbols()
登录后复制
登录后复制
登录后复制
,我们就能把那些隐藏的
Symbol
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
键名找出来了。这在设计一些内部属性,或者避免命名冲突时,
Symbol
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
键名非常有用,而这个方法就是用来管理它们的。

但如果你的需求是,我既想获取字符串键名,又想获取

Symbol
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
键名,一次性全部拿到,有没有办法呢?当然有!ES6的
Reflect
登录后复制
对象提供了一个非常强大的方法:
Reflect.ownKeys()
登录后复制
登录后复制
登录后复制
登录后复制

Reflect.ownKeys()
登录后复制
登录后复制
登录后复制
登录后复制
会返回一个数组,包含对象自身的所有属性键名,无论是字符串还是
Symbol
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,并且不考虑它们的可枚举性。这就像是一个“全能扫描仪”,把对象第一层的所有键名都给你列出来。

const allKeys = Reflect.ownKeys(myObject);
console.log('所有键名 (字符串 + Symbol):', allKeys);
// 输出: 所有键名 (字符串 + Symbol): ["name", Symbol(id), "age", Symbol(secret)]
登录后复制

在我处理一些需要深度自省(introspection)或者实现代理(Proxy)逻辑时,

Reflect.ownKeys()
登录后复制
登录后复制
登录后复制
登录后复制
就显得尤为重要。它提供了一个统一的接口来获取对象的所有自有属性键,无论它们的类型或可枚举性如何,这让代码处理起来更加一致和健壮。所以,当你面对更复杂的键名类型时,记住
Object.getOwnPropertySymbols()
登录后复制
登录后复制
登录后复制
Reflect.ownKeys()
登录后复制
登录后复制
登录后复制
登录后复制
这两个工具

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

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

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

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

Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号