获取 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 的描述的主要内容,如果未能解决你的问题,请参考以下文章

Es6 Symbol.iterator

ES6-----学习系列九(Symbol数据类型)

ES6知识整理--Symbol函数

JavaScript系列之ES6篇

ES6中获取对象的key

ES6 Symbol