object.getownpropertynames() 返回对象自身所有属性名(含不可枚举的),不包括原型链属性和 symbol 属性;例如 obj 有 a(可枚举)、b(不可枚举)、c(可枚举)时,返回 ['a', 'b', 'c']。

Object.getOwnPropertyNames() 用于获取对象**自身所有属性名(字符串数组)**,包括可枚举和不可枚举的,但**不包括原型链上的属性**。
它能拿到哪些属性?
只返回对象“自有”的属性名(即直接定义在该对象上),满足两个条件:
- 属性必须是对象自身的(不是从原型继承来的)
- 无论该属性是否设置了
enumerable: false,都会被包含
和 Object.keys() 的关键区别
Object.keys() 只返回可枚举的自有属性名,而 Object.getOwnPropertyNames() 是它的“增强版”——把不可枚举的也一并列出。
例如:
const obj = { a: 1 };
Object.defineProperty(obj, 'b', {
value: 2,
enumerable: false // 不可枚举
});
Object.defineProperty(obj, 'c', {
value: 3,
enumerable: true // 可枚举
});
console.log(Object.keys(obj)); // ['a', 'c']
console.log(Object.getOwnPropertyNames(obj)); // ['a', 'b', 'c']
常见用途场景
- 调试时想看清对象到底有哪些自有属性(比如发现某个属性“看不见”但实际存在)
- 做深拷贝或序列化前,确保连不可枚举属性(如某些库内部用的标记属性)也被处理
- 配合 Object.getOwnPropertyDescriptor() 检查某个属性的完整描述(如是否可写、是否可配置)
注意点
- 不会遍历原型链,想获取继承的属性需手动向上查(如用
Object.getPrototypeOf()链式调用) - 返回的是属性名(字符串),不是属性值;要取值得配合
obj[prop]或Object.getOwnPropertyDescriptor() - Symbol 类型属性不会被返回,要用 Object.getOwnPropertySymbols() 单独获取
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











