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
相关产品推荐
相关产品推荐

