【问题标题】:Is an ES6 Symbol just a string with @@ appended to it?ES6 符号只是一个附加了@@ 的字符串吗?
【发布时间】:2018-05-07 19:57:15
【问题描述】:

假设我创建了一个符号:

Symbol('r2g.smoke.test')

是不是和String('@@r2g.smoke.test')一样,还是不一样?

【问题讨论】:

标签: javascript ecmascript-6


【解决方案1】:

不,描述为r2g.smoke.test 的符号与字符串@@r2g.smoke.test 没有任何关系。 Symbol 通常与字符串完全不同。

【讨论】:

  • 对一个对象只能以数字或字符串作为键,所以符号必须能够字符串化等
  • @OlegzandrDenman 对象只能将字符串或符号作为属性。他们不能有数字。任何不是字符串或符号的东西在用作键之前都会被强制转换为字符串:var obj = {}; obj[1] = 'test'; Object.keys( obj ).forEach( key => console.log( key, typeof key ) ); 输出1 string。与数字(和所有其他类型)不同,符号在用作对象属性时不会转换为字符串,因为这在很大程度上会破坏它们的用途。
【解决方案2】:

不,虽然打印符号可能会添加 @ 符号以提高可读性,但 ES2015 symbol 与字符串非常不同。

Symbol 的关键在于每次调用它时,都会得到一个唯一 版本的符号。您传入的字符串(例如'r2g.smoke.test')只是一个有用的描述。

一些代码来演示:

~$ node
> const string1 = "hello"
> const string2 = "hello"
> string1 === string2
true
> const symbol1 = Symbol("hello")
> const symbol2 = Symbol("hello")
> symbol1 === symbol2
false

保证每次调用 Symbol() 时,您都会得到一个与其他符号不同的唯一符号,即使您传入的描述也是如此是一样的

【讨论】:

  • 实际上,我认为您可能错了,Symbol('x') === Symbol('x') 总是,请阅读文档
  • @OlegzandrDenman 他没有错Symbol('x') !== Symbol('x'),总是。这与 Symbol.for('x') === Symbol.for('x') 形成鲜明对比,后者应尽可能避免,原因与应避免使用全局变量相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 1970-01-01
  • 2017-06-06
相关资源
最近更新 更多