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

时间:2015-07-11 12:00:52

标签: javascript symbols ecmascript-6

我正在玩ES6,看着符号。与红宝石不同,例如你写:symbol,ES6符号似乎被允许任何"标准"变量名。说实话,我觉得这很混乱:

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

因为它倾向于让我认为privateProperty可能是像前几年一样的简单字符串。使用:privateProperty无效。

就像将$bar用于jQuery对象或bar$用于RxJS / Bacon流一样,我想知道是否已经建立了在ES6中命名符号的约定?

1 个答案:

答案 0 :(得分:3)

  

obj[privateProperty] = …;倾向于让我认为privateProperty可能是一个像前几年一样的字符串。

嗯,这是我们需要忘记的旧思维。 privateProperty ,可以是字符串(属性名称)或符号。同样,我们已经学会区分(整数)索引和“普通”属性。

  

ES6似乎允许任何“标准”变量名称

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

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

  

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

虽然没有关于命名符号保持变量的约定(但是),当然有一个命名符号本身的约定:

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

对变量使用相同的名称可能是最佳做法(就像本机符号已经做的那样,Symbol.iterator.toString() == "Symbol(Symbol.iterator)")。