如何获取JavaScript对象中Symbol属性对应的变量名?
如何获取Symbol对应的变量名而非
Symbol()或描述? 很遗憾,你没办法直接从Symbol值本身获取到它对应的变量名(比如isMoving、currentStatus),核心原因是:变量名只是当前作用域里用来指向Symbol值的标识符,Symbol实例本身和这个变量名没有任何绑定关系。
举个例子,当你执行var isMoving = Symbol();时,isMoving只是当前作用域里的一个变量,它的值是一个Symbol对象,但这个Symbol对象完全不知道自己被赋值给了叫isMoving的变量。所以不管你用Reflect.ownKeys()还是Object.getOwnPropertySymbols(),拿到的都只是Symbol值本身,而非变量名。
替代方案1:使用Symbol描述(最简便)
这是你已经尝试过的方式,给Symbol添加一个和变量名一致的描述字符串,虽然它不是真正的变量名,但可以起到清晰的标识作用:
var myVehicle = { brand: 'Tesla' }; var isMoving = Symbol('isMoving'); var currentStatus = Symbol('currentStatus'); myVehicle[isMoving] = true; myVehicle[currentStatus] = 'moving'; Object.getOwnPropertySymbols(myVehicle).forEach((sym, index) => console.log( `${index + 1}. Symbol Description: ${sym.description}: ${myVehicle[sym]}`, ), );
执行后输出:
1. Symbol Description: isMoving: true 2. Symbol Description: currentStatus: moving
替代方案2:维护变量名-Symbol映射表(精准获取变量名)
如果确实需要拿到变量名,可以额外维护一个映射表,记录变量名和对应的Symbol值,这样就能实现反向查找:
var myVehicle = { brand: 'Tesla' }; // 维护映射表,关联变量名和Symbol const symbolVarMap = { isMoving: Symbol(), currentStatus: Symbol() }; // 给对象赋值时用映射表中的Symbol myVehicle[symbolVarMap.isMoving] = true; myVehicle[symbolVarMap.currentStatus] = 'moving'; // 遍历对象的Symbol属性,反向查找变量名 Object.getOwnPropertySymbols(myVehicle).forEach(sym => { const varName = Object.keys(symbolVarMap).find(key => symbolVarMap[key] === sym); console.log(`${varName}: ${myVehicle[sym]}`); });
执行后输出:
isMoving: true currentStatus: moving
这个方案的优势是能精准拿到你想要的变量名,但需要额外维护映射表,适合对变量名有明确需求的场景。
总结
- Symbol值本身不存储对应的变量名信息,无法直接通过Symbol值反向获取变量名
- 使用Symbol描述是最轻量化的标识方案
- 维护映射表可以实现变量名与Symbol值的双向关联,适合需要精准获取变量名的场景
内容的提问来源于stack exchange,提问作者user3025289
相关产品推荐
相关产品推荐

