【问题标题】:Get the description of a ES6 Symbol获取 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的概念来实现唯一性。

标签: javascript symbols ecmascript-6


【解决方案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("")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
相关资源
最近更新 更多