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

Javascript ES6中是否有命名符号的约定?,javascript,symbols,ecmascript-6,Javascript,Symbols,Ecmascript 6,我在玩ES6,看符号。与ruby不同,例如,在ruby中,您可以编写:symbol,ES6符号似乎可以用于任何“标准”变量名。老实说,我发现这相当令人困惑: var privateProperty = Symbol(); var obj = {}; obj[privateProperty] = 'some value goes here'; 因为它往往让我认为,privateProperty可能是一个简单的字符串,就像几年前一样。使用:privateProperty无效 因此,就像对jQuer

我在玩ES6,看符号。与ruby不同,例如,在ruby中,您可以编写
:symbol
,ES6符号似乎可以用于任何“标准”变量名。老实说,我发现这相当令人困惑:

var privateProperty = Symbol();
var obj = {};
obj[privateProperty] = 'some value goes here';
因为它往往让我认为,
privateProperty
可能是一个简单的字符串,就像几年前一样。使用
:privateProperty
无效

因此,就像对jQuery对象使用
$bar
或对RxJS/Bacon流使用
bar$
一样,我想知道ES6中是否已经有了命名符号的约定

obj[privateProperty]=
让我觉得
privateProperty
很可能是一个简单的字符串,就像几年前一样

嗯,这是我们需要忘记的旧想法
privateProperty
是一个键,可以是字符串(属性名称)或符号。类似地,我们已经学会了区分(整数)索引和“正常”属性

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

就像鲁比一样。区别在于ES6没有为符号引入文字符号(解析为同一事物),而是允许仅通过使用
Symbol
(本地)或
Symbol.for
(全局)创建符号

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

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

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

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

最好对变量使用相同的名称(就像本机符号一样,
Symbol.iterator.toString()=“Symbol(Symbol.iterator)”
)。

符号只是一个值。指定给它的变量不是它的名称。变量只是值的容器,就像任何其他值(数字、字符串、对象等)一样。我知道,我的示例只是误导性的编辑。更改变量名称实际上没有任何区别。持有符号引用的变量怎么办?有时我将它们存储在对象中,但有时也存储在不同的变量中。在我自己的代码中,当函数必须具有相同的名称时,可能会出现名称冲突。我倾向于用大写字母写这些变量:
constmap=Symbol(“MAP”)
,但我不确定。哦,符号是不可变的。@IvenMarquardt正如我所说,它们也没有约定。在大小写中使用大写名称可能更多是因为它是一个常量,而较少是因为它包含一个符号。