我正在开发一款通过网络发送部分数据的ES6应用。部分内容涉及作为ES6 Symbol
实现的标识符。例如:
const FOO = Symbol('foo');
致电Foo.toString()
会产生Symbol(foo)
。当我通过网络传递这些内容时,我想将其作为foo
传递。但是,据我所知,没有办法从foo
中提取Symbol(foo)
,除非用正则表达式(特别是/^Symbol\((.*)\)$/
)将其删除。
我应该依赖正则表达式始终匹配吗?或者,对ES6的未来更新是否可能会破坏这一点?如果我不能依赖正则表达式匹配,那么我只需将其作为Symbol(foo)
通过网络发送。
答案 0 :(得分:4)
根据spec,它总是<ion-view><!--content--></ion-view>
。
"Symbol(" + description + ")"
从内部方法调用返回一个字符串Symbol.prototype.toString
:
让 desc 成为 sym 的
SymbolDescriptiveString(sym)
值。
如果 desc 为[[Description]]
,请将 desc 设为空字符串。
[...]
返回连接字符串undefined
, desc 和"Symbol("
的结果。
现在,在2018年更新此答案,您有两种选择:
使用(或polyfill)Symbol.prototype.description
,它可能是未来ECMAScript版本的一部分(目前是stage 3提案,主要由预发布的浏览器支持):
")"
或者像这样使用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
由于描述周围的字符串是固定的,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"