You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中Object.getOwnPropertySymbols与Reflect.ownKeys如何处理Symbol?

JavaScript中Symbol属性的访问与相关API解析

首先明确Symbol的核心特性:任意两个Symbol实例都是唯一不相等的,因此Symbol('foo') == Symbol('foo')的结果为false。

当对象使用Symbol类型作为属性键时,如果没有提前将该Symbol保存到变量中,直接通过新建Symbol的方式无法访问对应属性:

const obj = {[Symbol('foo')]: 'bar'};
console.log(obj[Symbol('foo')]); // undefined

但通过Object.getOwnPropertySymbols和Reflect.ownKeys这两个方法,却能获取到对象的Symbol属性键,进而访问对应值:

console.log(obj[Object.getOwnPropertySymbols(obj)[0]]); // bar
console.log(obj[Reflect.ownKeys(obj)[0]]); // bar

为什么这两个方法能获取到相同的Symbol?

这两个方法并非生成新的Symbol,而是直接读取对象自身存储的Symbol属性键实例。当你用[Symbol('foo')]定义对象属性时,这个Symbol实例已经被存入对象的属性键集合中,Object.getOwnPropertySymbols会返回对象自身所有Symbol类型的属性键数组,Reflect.ownKeys则会返回对象自身所有属性键(包括字符串和Symbol类型)。它们拿到的都是对象上原本存储的那个Symbol实例,自然和定义属性时的Symbol是同一个,所以能正确访问到属性值。

它们是否能访问Symbol的内部存储结构?

不能。这两个方法只是遵循ECMAScript规范提供的接口,从对象的属性键集合中读取已存在的Symbol实例,并没有触及Symbol的内部存储细节。Symbol的唯一性是由引擎层面保证的,外部代码无法直接访问或修改它的内部存储结构,这两个API只是暴露了对象上已存在的Symbol属性的访问途径而已。

内容的提问来源于stack exchange,提问作者Mouhammad Mahmoodi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:12:01