获取ES6 Symbol的描述。

15

我想知道是否有一种简便的方法来获取符号的描述。

例如,

var s = Symbol(5);

默认的toString实现仅会打印Symbol(5)

我希望找到一种方法来提取实际的描述,即5


2
可以使用正则表达式:/^Symbol\((.+?)\)$/.exec("Symbol(5)"); 或者切片方法:"Symbol(5)".slice(7,-1); - Hacketo
谢谢您的评论。基本上这就是我最终所做的。但我认为有一个预定义的API可以实现这个功能。 - ppoliani
你能详细说明一下你实际上想通过这样做实现什么吗?因为你真的不应该访问那个值,所以没有暴露API。它只是用于调试目的。 - loganfsmyth
1
我想运用符号来应用枚举的概念,以实现独一无二。 - ppoliani
如何获取符号名称和字面量?类似的示例可以在这里找到:https://dev59.com/66jja4cB1Zd3GeqP5xxV - user3025289
4个回答

15

Symbol.description 返回符号的描述。 在您的情况下,只需使用 s.description


3
这是正确的答案,在现代环境下非常有效,但请注意这仍然很新,并且甚至在当前的 Node LTS 发布版本(10.15.3)中也没有得到支持。 - Tim Perry
@TimPerry 是正确的,Node 仍然不支持 Symbol.description。[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/description#Browser_compatibility]。但是,作为一种解决方法,您可以编写一个类似这样的帮助函数。 private resolveSymbol(symbol: Symbol): string { const regExp = /\(([^)]+)\)/; const names = regExp.exec(symbol.toString()) || []; return names[1]; } - Rushi patel
@Rushipatel 这对于 Symbol(")")Symbol("") 不起作用。请不要使用正则表达式来获取描述。改为使用 String(symbol).slice(7,-1),但请注意只有真正的 Symbol.prototype.description 才能区分 Symbol()Symbol("") - Sebastian Simon

1
 String(symbol).slice(7, -1) || null

这是因为String(symbol)将符号显式地转换为字符串,例如Symbol('test')被转换为"Symbol(test)"
在从7到-1的范围内进行拼接会在两个括号之间进行拼接,从而捕获描述test注意:这对于对象描述(例如Symbol({test}))可能无效,因为对象被强制转换为"[object Object]"

1
你好!欢迎来到 Stack Overflow。您能否添加一些解释说明如何/为什么这个答案回答了问题? - Ryan Gates
3
对象描述中没有符号,描述总是被转换为字符串。 - Bergi

1

没有简单的方法来做这件事。但是,如果您已经在全局注册表中注册了一个符号,您可以使用 Symbol.keyFor()函数:

var s = Symbol.for(5);
console.log(Symbol.keyFor(s));

谢谢!这也适用于“旧”的Node 10,其中不支持Symbol.prototype.description - Assaf Sapir

-7

symbol-description npm包

返回提供的符号的描述:

const symDesc = require('symbol-description')
symDesc(Symbol('foo')) // foo

我在阅读了这个答案后刚刚发布了它。


3
所以你为了一行代码创建了一个npm包? - zfrisch
3
我为你做到了。 - Shahar 'Dawn' Or

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接