Object.keys()返回对象自身可枚举字符串属性名组成的数组,不包括继承属性、不可枚举属性、Symbol键和私有字段;配合Object.getOwnPropertyNames()、Object.getOwnPropertySymbols()和Reflect.ownKeys()可获取更完整属性信息。

Object.keys() 是 JavaScript 中获取对象自身可枚举属性名的标准方法,它返回一个由字符串组成的数组,只包含对象**自身定义的、且可枚举(enumerable: true)的属性名**,不包括继承属性、Symbol 属性或不可枚举属性(如 Object.prototype.toString)。
基本用法:获取普通对象的键名
对普通对象调用 Object.keys(),会按属性定义顺序(ES2015+ 规定)返回所有可枚举自有属性的字符串键名:
const obj = { name: 'Alice', age: 30, city: 'Beijing' };
console.log(Object.keys(obj)); // ['name', 'age', 'city']
注意:即使属性值为 null、undefined 或 0,只要属性存在且可枚举,就会被包含。
不包含哪些属性?
以下几类属性不会出现在 Object.keys() 的结果中:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 原型链上的属性(如从
Object.prototype继承的toString、hasOwnProperty) - 不可枚举属性(通过
Object.defineProperty显式设为enumerable: false) - Symbol 类型的键(即使可枚举,也要用
Object.getOwnPropertySymbols()获取) - 私有字段(
#field)——语法层面不可访问,自然不会被列出
const parent = { type: 'user' };
const child = Object.create(parent);
child.name = 'Bob';
Object.defineProperty(child, 'id', { value: 123, enumerable: false });
console.log(Object.keys(child)); // ['name'] —— 不含 type(继承)、id(不可枚举)
配合其他方法获取更完整的属性信息
若需包含不可枚举或 Symbol 属性,可组合使用:
-
Object.getOwnPropertyNames(obj):返回所有自身属性名(含不可枚举字符串键) -
Object.getOwnPropertySymbols(obj):返回所有自身 Symbol 键 -
Reflect.ownKeys(obj):返回所有自身键名(字符串 + Symbol),等价于前两者合并
const sym = Symbol('key');
const obj = { a: 1 };
Object.defineProperty(obj, 'b', { value: 2, enumerable: false });
obj[sym] = 'symbol value';
console.log(Object.keys(obj)); // ['a']
console.log(Object.getOwnPropertyNames(obj)); // ['a', 'b']
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(key)]
console.log(Reflect.ownKeys(obj)); // ['a', 'b', Symbol(key)]
实用小技巧:安全遍历与类型检查
由于 Object.keys() 总是返回数组,可用于安全判断是否为普通对象并遍历:
- 避免对
null或undefined调用(会报错),建议先校验: - 对非对象值(如字符串、数字)调用会自动包装,但通常无意义;推荐显式判断类型:
function safeGetKeys(obj) {
if (obj !== null && typeof obj === 'object') {
return Object.keys(obj);
}
return [];
}
console.log(safeGetKeys({ x: 1 })); // ['x']
console.log(safeGetKeys(null)); // []
console.log(safeGetKeys('hello')); // [](字符串不是普通对象)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










