ES6 中是否有命名符号的约定?

Is there a convention for naming symbols in ES6?

我正在研究 ES6,查看符号。不像 ruby 例如你写 :symbol,ES6 符号似乎允许任何 "standard" 变量名。老实说,我觉得这很混乱:

var privateProperty = Symbol();
var obj = {};
obj[privateProperty] = 'some value goes here';

因为它让我觉得 privateProperty 可能是像几年前一样的普通字符串。使用 :privateProperty 无效。

所以就像对 jQuery 对象使用 $bar 或对 RxJS/Bacon 流使用 bar$ 一样,我想知道是否已经存在命名符号的约定在 ES6 中?

obj[privateProperty] = …; tends to make me think that privateProperty is probably a plain string like the years before.

嗯,这是我们需要忘记的旧思想。 privateProperty 是一个 key,它可以是字符串 (属性 name) 或符号。同样,我们已经学会了区分(整数)indices 和 "normal" properties.

ES6 seems to allow any "standard" variable name

就像 Ruby 一样。不同之处在于 ES6 没有为符号引入文字符号(解析为同一事物),但只允许使用 Symbol(本地)或 Symbol.for(全局)创建它们。

对于保存符号值的变量的命名,没有标准约定
当然,如果您想要这样的类型注释,您总是可以使用 hungarian notation。如果我必须创造一个标准,我会建议使用更微妙的前导下划线 (var _myPrivate)。 属性 名称中的下划线总是暗示一些特殊的东西,并且它看起来类似于计算的 属性 键(obj[_myPrivate])然后。

Is there a convention for naming symbols in ES6?

虽然(还)没有命名符号持有变量的约定,但肯定有命名符号本身的约定:

  • 局部符号应该有一个非常具有描述性的描述符字符串(作为 Symbol 的参数给出)。当然,无论如何,它们仍然是独一无二的,所以你基本上可以使用任何你想要的名字。
  • 全局符号需要避免冲突。约定是适当地为它们命名空间,并用点连接这些命名空间名称 - 就像 Java 包名称。如果该符号可用作全局变量,则其描述符应具有相同的名称(类似于内置的本机符号,如 @@iterator = Symbol.for("Symbol.iterator");)。如果符号由模块或库导出,其描述符应以 module/library 名称作为前缀(以避免冲突)。

最好为变量使用相同的名称(就像本机符号已经做的那样,Symbol.iterator.toString() == "Symbol(Symbol.iterator)")。