Object.getOwnPropertyNames和Object.getOwnPropertySymbols分别获取对象自身所有字符串键名和Symbol键名的自有属性(含不可枚举),需手动合并二者结果才能获得全部自有属性名。

Object.getOwnPropertyNames 和 Object.getOwnPropertySymbols 都只能获取**自身**(非继承)的属性,且分别针对**字符串键名**和**Symbol 键名**。它们**不会自动合并**,也不能直接获取“所有属性”——想拿到全部自有属性(含字符串和 Symbol),需要手动拼接两者结果。
只获取字符串键名:Object.getOwnPropertyNames
返回一个数组,包含对象自身所有**可枚举 + 不可枚举**的字符串类型属性名(即 key 是 string 的自有属性),不包括 Symbol、不包括原型链上的属性。
例如:
const obj = { a: 1 };
Object.defineProperty(obj, 'b', { value: 2, enumerable: false });
obj.c = 3;
console.log(Object.getOwnPropertyNames(obj)); // ['a', 'b', 'c']
注意:'b' 虽不可枚举,仍被包含;Symbol('x') 类型的属性不会出现。
立即学习“Java免费学习笔记(深入)”;
只获取 Symbol 键名:Object.getOwnPropertySymbols
返回一个数组,包含对象自身所有 Symbol 类型的自有属性名(不管是否可枚举)。
例如:
const sym1 = Symbol('s1');
const sym2 = Symbol('s2');
const obj = { [sym1]: 'val1' };
Object.defineProperty(obj, sym2, { value: 'val2', enumerable: false });
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(s1), Symbol(s2)]
获取所有自有属性名(字符串 + Symbol)
这是实际开发中更常见的需求。需调用两个方法,再用扩展运算符或 concat 合并:
[...Object.getOwnPropertyNames(obj), ...Object.getOwnPropertySymbols(obj)]- 或
Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj))
这样得到的数组就包含了该对象全部自有属性的 key(无论类型、无论枚举性)。
注意:不包含继承属性和 `__proto__` / `prototype`
这两个方法严格限定于“自身属性”,原型链上的属性(如 toString)、obj.__proto__ 上的键、构造函数的 prototype 属性,都不会被返回。若需遍历整条原型链,得配合 Object.getPrototypeOf 递归处理,但那已超出这两个 API 的职责范围。


















