object.getownpropertynames 返回对象所有自有属性名(含不可枚举字符串键,不含symbol和继承属性),顺序为先字符串键后数字索引键;而 object.keys 仅返回可枚举自有属性名。

Object.getOwnPropertyNames 用于获取对象**所有自有属性(包括不可枚举的)的属性名数组**,不包含继承属性,也不管属性是否可枚举。
基本用法:获取所有自有属性名
它接收一个对象作为参数,返回一个字符串数组,包含该对象自身所有属性的键名(无论 enumerable: true 还是 false)。
- 只遍历对象自身的属性,不会向上查找原型链上的属性
- 会包含
Symbol类型以外的所有自有属性名(注意:不包含 Symbol 属性,要用Object.getOwnPropertySymbols单独获取) - 返回顺序:先按创建顺序列出字符串键(包括不可枚举的),再按创建顺序列出数字索引键(如果存在)
和 Object.keys 的区别
Object.keys(obj) 只返回**可枚举的自有属性名**;而 Object.getOwnPropertyNames(obj) 返回**所有自有属性名(含不可枚举)**。
- 例如,
obj.toString是继承来的,不会出现在两者结果中 - 但如果你手动定义了一个不可枚举属性:
Object.defineProperty(obj, 'hidden', { value: 42, enumerable: false }),它会被getOwnPropertyNames捕获,但不会被Object.keys返回
实际使用示例
常见于调试、序列化、深拷贝或需要完整属性清单的场景:
- 检查对象是否含有隐藏/不可枚举字段(如某些库内部添加的标记属性)
- 实现“浅克隆”时确保复制所有自有属性(包括不可枚举的)
- 配合
Object.getOwnPropertyDescriptor获取每个属性的完整描述(如writable、configurable等)
示例代码:
const obj = { a: 1 };Object.defineProperty(obj, 'b', { value: 2, enumerable: false });
console.log(Object.getOwnPropertyNames(obj)); // ['a', 'b']
console.log(Object.keys(obj)); // ['a']
注意事项
该方法对 null 或 undefined 会抛出 TypeError,使用前建议做类型判断。
- 不能直接获取 Symbol 属性 —— 需搭配
Object.getOwnPropertySymbols() - 数组也是对象,所以
Object.getOwnPropertyNames([1, 2])会返回['0', '1', 'length'] - 函数对象的自有属性(如通过
fn.x = 1添加)也会被包含
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











