reflect.ownkeys() 返回对象所有自有属性键(含字符串和symbol),按创建顺序排列,涵盖可枚举与不可枚举属性,是 object.keys() 和 object.getownpropertynames() 的完整替代方案。

Reflect.ownKeys() 可以一次性获取对象的所有自有属性键(包括字符串键和 Symbol 键),且保持与 Object.getOwnPropertyNames() + Object.getOwnPropertySymbols() 合并后相同的顺序:先字符串键(按创建顺序),再 Symbol 键(也按创建顺序)。
基本用法:获取全部自有键
它接受一个对象作为参数,返回一个数组,包含该对象所有**自有**(非继承)、**可枚举或不可枚举**的属性键(字符串和 Symbol 都包含):
- 不会遍历原型链,只返回对象自身的属性键
- 不区分可枚举性,
enumerable: false的属性也会被包含 - Symbol 类型的属性键(如
Symbol('id'))会被原样返回
对比 Object.keys() 和 Object.getOwnPropertyNames()
Object.keys() 只返回可枚举的字符串键;Object.getOwnPropertyNames() 返回所有自有字符串键(含不可枚举),但不包含 Symbol;而 Reflect.ownKeys() 是最完整的替代方案:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Object.keys(obj)→['a', 'b'](仅可枚举字符串) -
Object.getOwnPropertyNames(obj)→['a', 'b', 'c'](所有字符串,含不可枚举) -
Reflect.ownKeys(obj)→['a', 'b', 'c', Symbol(foo), Symbol(bar)](字符串 + Symbol,全包含)
实际使用示例
例如:
const sym1 = Symbol('foo');
const sym2 = Symbol('bar');
const obj = {
a: 1,
b: 2
};
Object.defineProperty(obj, 'c', { value: 3, enumerable: false });
obj[sym1] = 'symbol1';
obj[sym2] = 'symbol2';
console.log(Reflect.ownKeys(obj));
// ['a', 'b', 'c', Symbol(foo), Symbol(bar)]
注意:如果对象没有 Symbol 属性,结果就等价于 Object.getOwnPropertyNames(obj);有 Symbol 时才体现出优势。
配合 getOwnPropertyDescriptor 使用更完整
拿到键之后,常配合 Reflect.getOwnPropertyDescriptor() 获取每个键的详细描述(如 value、writable、enumerable、configurable 等):
- 可用于深拷贝、序列化、代理拦截等需要完整元信息的场景
- 尤其在
Proxy中,ownKeystrap 的返回值必须是Reflect.ownKeys(target)的子集,否则会报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










