我正在开发一个ES6应用程序,该应用程序通过网络发送其一些数据。其中一部分涉及实现为ES6Symbol
的标识符。例如:
const FOO = Symbol('foo');
调用Foo.toString()
收益率Symbol(foo)
。当我通过网络传递这些信息时,我想像一样传递它foo
。但是,据我所知,除了使用正则表达式(特别是)将其提取foo
出来Symbol(foo)
之外,没有其他方法可以提取/^Symbol\((.*)\)$/
。
我应该依靠始终匹配的正则表达式吗?还是将来对ES6的更新有可能打破这一点?如果我不能依靠正则表达式匹配,那么我将直接通过来发送它Symbol(foo)
。
根据规范,它始终为"Symbol(" + description + ")"
。
Symbol.prototype.toString
从内部方法调用返回一个字符串SymbolDescriptiveString(sym)
:
让desc成为sym的
[[Description]]
价值。
如果desc是undefined
,则使desc为空字符串。
[…]
返回"Symbol("
,desc和的字符串连接")"
。
现在,在2019年更新此答案,您有两种选择:
使用(或polyfill)Symbol.prototype.description
,这是ECMAScript 2019的一部分,并且受所有现代JavaScript引擎支持:
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
是一个很好的选择,特别是因为符号描述本身可能包含括号,换行符,字符串"Symbol"
等,并且.
正则表达式中的例如将与换行符不匹配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句