Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以依赖ES6`Symbol`的字符串表示吗?_Javascript_Ecmascript 6_Symbols - Fatal编程技术网

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

Javascript 我可以依赖ES6`Symbol`的字符串表示吗?,javascript,ecmascript-6,symbols,Javascript,Ecmascript 6,Symbols,我正在开发一个ES6应用程序,它通过网络发送一些数据。其中一部分涉及实现为ES6Symbols的标识符。例如: const FOO = Symbol('foo'); 调用Foo.toString()产生Symbol(Foo)。当我通过网络传递这些信息时,我希望将其作为foo传递。但是,据我所知,除了使用正则表达式(特别是,/^Symbol\(.*)$/)将其提取出来之外,没有其他方法可以从Symbol(foo)中提取foo 我应该依赖正则表达式始终匹配吗?或者将来对ES6的更新可能会破坏这一点

我正在开发一个ES6应用程序,它通过网络发送一些数据。其中一部分涉及实现为ES6
Symbol
s的标识符。例如:

const FOO = Symbol('foo');
调用
Foo.toString()
产生
Symbol(Foo)
。当我通过网络传递这些信息时,我希望将其作为
foo
传递。但是,据我所知,除了使用正则表达式(特别是,
/^Symbol\(.*)$/
)将其提取出来之外,没有其他方法可以从
Symbol(foo)
中提取
foo

我应该依赖正则表达式始终匹配吗?或者将来对ES6的更新可能会破坏这一点吗?如果我不能依赖正则表达式匹配,那么我将根据它始终是
“Symbol(“+description+””)
通过电线将其作为
Symbol(foo)
发送

Symbol.prototype.toString
从对
SymbolDescriptiveString(sym)
的内部方法调用返回字符串:

让desc为sym的
[[Description]]
值。
如果desc是未定义的,则让desc为空字符串。
[…]
返回
”符号(“
、desc和
”)的字符串串联。

现在,在2019年更新这个答案,您有两个选择:

  • 使用(或polyfill),所有现代JavaScript引擎都支持:

    const foo=Symbol(“foo”),
    条形=符号。对于(“条形”),
    iter=Symbol.iterator;
    console.log(foo.description);//“福”
    console.log(bar.description);//“酒吧”
    
    console.log(Symbol.iterator.description);//“Symbol.iterator”
    唯一要添加到@Xufox”答案中的是
    Symbol.prototype.toString
    可能会被破坏(覆盖),在这种情况下,它可能会返回其他内容。鉴于这不是一个你想要/需要考虑的场景,它应该是好的;转到
    .toString().slice(7,-1)


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

    你会用

    const FOO = Symbol.for("foo");
    //                 ^^^
    
    然后可以获得符号的名称(也是它的描述)

    Symbol.keyFor(FOO) // "foo"
    

    您建议使用哪个正则表达式?建议使用
    /^Symbol\(.*)$/
    (然后使用第一个捕获组作为名称)。添加到问题中。根据说明,它总是
    符号(“+description+”)
    。您最好使用
    FOO.toString().slice(7,-1)
    ,因为符号描述本身可能包含括号、换行符等。例如,
    与换行符不匹配。太棒了,谢谢!这正是我一直在寻找的答案。这很好,但如果必须将单独的符号的描述设置为“foo”,则不起作用,因为
    Symbol所做的所有赋值。for(“foo”)
    将分配相同的符号。@Redu这就是它们是全局的,是的。您需要仔细选择
    foo