获取 ES6 Symbol 的描述
Posted
技术标签:
【中文标题】获取 ES6 Symbol 的描述【英文标题】:Get the description of a ES6 Symbol 【发布时间】:2015-07-29 20:53:41 【问题描述】:我想知道是否有一个很好的方法来获取符号的描述。
例如,
var s = Symbol(5);
toString 的默认实现将简单地打印 符号(5)
我想找到一种方法来提取实际描述,即 5
【问题讨论】:
可以使用正则表达式:/^Symbol\((.+?)\)$/.exec("Symbol(5)");
或切片:"Symbol(5)".slice(7,-1);
感谢您的评论。这基本上就是我最终所做的。但我认为有一个预定义的 API。
您能否详细说明您通过这样做实际想要达到的目标?没有公开的 API,因为您根本不应该真正访问该值。它只是用于调试目的。
我想应用Enums using Symbols的概念来实现唯一性。
密切相关:Can I rely on the string representation of an ES6 Symbol
?
【参考方案1】:
没有巧妙的方法可以做到这一点。但是,如果您在全局注册表中注册了符号,则可以使用Symbol.keyFor()
:
var s = Symbol.for(5);
console.log(Symbol.keyFor(s));
【讨论】:
谢谢!这也适用于“旧”节点 10,其中不支持Symbol.prototype.description
【参考方案2】:
String(symbol).slice(7, -1) || null
这是有效的,因为String(symbol)
明确地将符号强制转换为字符串,例如Symbol('test')
被强制转换为 "Symbol(test)"
。
对从 7 到 -1 进行拼接会在两个括号之间进行拼接,从而捕获描述 test
注意:这可能不适用于对象描述(例如Symbol(test)
),因为对象会被强制转换为"[object Object]"
【讨论】:
嗨!欢迎来到堆栈溢出。您能否就如何/为什么回答这个问题添加一些解释? 对象描述中没有符号,描述总是被转换成字符串。【参考方案3】:
symbol-description
npm 上的包
返回所提供符号的描述:
const symDesc = require('symbol-description')
symDesc(Symbol('foo')) // foo
这是我刚刚看完this answer here后发表的。
【讨论】:
所以你为一行代码创建了一个 npm 包? 我为你做了。【参考方案4】:Symbol.description
返回符号的描述。
只需根据您的情况做 s.description。
REF: https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Symbol/description
【讨论】:
这是正确的答案,它在非常现代的环境中运行良好,但请注意,这仍然是非常新的,甚至在当前节点 LTS 版本 (10.15.3) 中也不支持. @TimPerry 是对的,Node 仍然不支持 Symbol.description。 [developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。但是,作为一种解决方法,您可以编写一个像这样的辅助函数。private resolveSymbol(symbol: Symbol): string const regExp = /\(([^)]+)\)/; const names = regExp.exec(symbol.toString()) || []; return names[1];
@Rushipatel 这不适用于Symbol(")")
和Symbol("")
。请不要使用正则表达式来获取描述。请改用String(symbol).slice(7, -1)
,但请注意,只有真正的Symbol.prototype.description
才能区分Symbol()
和Symbol("")
。以上是关于获取 ES6 Symbol 的描述的主要内容,如果未能解决你的问题,请参考以下文章