我可以依赖ES6`Ir Symbol`的字符串表示吗?

时间:2015-11-08 16:04:09

标签: javascript ecmascript-6 symbols

我正在开发一款通过网络发送部分数据的ES6应用。部分内容涉及作为ES6 Symbol实现的标识符。例如:

const FOO = Symbol('foo');

致电Foo.toString()会产生Symbol(foo)。当我通过网络传递这些内容时,我想将其作为foo传递。但是,据我所知,没有办法从foo中提取Symbol(foo),除非用正则表达式(特别是/^Symbol\((.*)\)$/)将其删除。

我应该依赖正则表达式始终匹配吗?或者,对ES6的未来更新是否可能会破坏这一点?如果我不能依赖正则表达式匹配,那么我只需将其作为Symbol(foo)通过网络发送。

2 个答案:

答案 0 :(得分:4)

根据spec,它总是<ion-view><!--content--></ion-view>

"Symbol(" + description + ")"从内部方法调用返回一个字符串Symbol.prototype.toString

  

desc 成为 sym SymbolDescriptiveString(sym)值。
  如果 desc [[Description]],请将 desc 设为空字符串。
  [...]
  返回连接字符串undefined desc "Symbol("的结果。

现在,在2018年更新此答案,您有两种选择:

  1. 使用(或polyfill)Symbol.prototype.description,它可能是未来ECMAScript版本的一部分(目前是stage 3提案,主要由预发布的浏览器支持):

    ")"

  2. 或者像这样使用const foo = Symbol("foo"), bar = Symbol.for("bar"), iter = Symbol.iterator; console.log(foo.description); // "foo" console.log(bar.description); // "bar" console.log(Symbol.iterator.description); // "Symbol.iterator"

    Symbol.prototype.toString

  3. 由于描述周围的字符串是固定的,const foo = Symbol("foo"), bar = Symbol.for("bar"), iter = Symbol.iterator; console.log(foo.toString().slice(7, -1)); // "foo" console.log(bar.toString().slice(7, -1)); // "bar" console.log(iter.toString().slice(7, -1)); // "Symbol.iterator" // Or without “magic numbers”: console.log(foo.toString().slice("Symbol(".length, -")".length)); // "foo" console.log(bar.toString().slice("Symbol(".length, -")".length)); // "bar" console.log(iter.toString().slice("Symbol(".length, -")".length)); // "Symbol.iterator"是一个很好的选择,特别是因为符号描述本身可能包含括号,换行符等。正则表达式中的slice赢了例如,不匹配换行符。

答案 1 :(得分:3)

唯一可以添加到@ Xufox&#39;答案是Symbol.prototype.toString可能被泄露(覆盖),在这种情况下它可能会返回其他内容。鉴于这不是你想要/需要考虑的情况,它应该没问题;转到.toString().slice(7, -1);

您可能需要考虑的替代解决方案是使用全局符号。如果您打算传递数据,并且需要防止名称冲突,这将是一个合适的用例(假设您没有编写应该由第三方使用的库)

您使用

const FOO = Symbol.for("foo");
//                 ^^^

然后可以通过

获取符号的名称(也是其描述)
Symbol.keyFor(FOO) // "foo"