object.keys只返回对象自身可枚举的字符串键名,自动排除不可枚举属性、symbol属性和原型链属性;其他api如object.getownpropertynames、reflect.ownkeys等行为不同,应按需选用。

Object.keys 只返回对象自身可枚举(enumerable: true)的字符串键名,天然跳过不可枚举属性、Symbol 属性和原型链上的属性,无需额外过滤。
Object.keys 的默认行为就是“过滤不可枚举属性”
它内部只遍历对象自身的、且 enumerable 为 true 的字符串键名。比如:
const obj = {};
Object.defineProperty(obj, 'hidden', {
value: 'secret',
enumerable: false // 不可枚举
});
obj.visible = 'ok';
<p>console.log(Object.keys(obj)); // ['visible']
// 'hidden' 自动被排除,无需手动判断</p>需要区分的其他遍历方式
如果你曾混用过其他 API,注意它们的行为差异:
- Object.getOwnPropertyNames():返回所有自身字符串键名,包括不可枚举的
- Object.getOwnPropertySymbols():返回自身 Symbol 键名
- for...in:遍历自身 + 原型链上所有可枚举属性(字符串键)
- Reflect.ownKeys():返回所有自身键名(字符串 + Symbol),不关心是否可枚举
想“主动过滤”时其实没必要加判断
以下写法是冗余的:
// ❌ 多此一举:Object.keys 已保证全是可枚举的
Object.keys(obj).filter(key => Object.getOwnPropertyDescriptor(obj, key).enumerable)
<p>// ✅ 直接用即可
Object.keys(obj).forEach(key => { /<em> 安全使用 key </em>/ })</p>若需包含 Symbol 或不可枚举属性,换用对应 API
根据目标选择更合适的工具:
- 要所有自身字符串键(含不可枚举)→ 用 Object.getOwnPropertyNames()
- 要所有自身键(含 Symbol)→ 用 Reflect.ownKeys()
- 要判断某个属性是否可枚举 → 用 Object.prototype.propertyIsEnumerable.call(obj, key)
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











