ES6 中是不是有命名符号的约定?
Posted
技术标签:
【中文标题】ES6 中是不是有命名符号的约定?【英文标题】:Is there a convention for naming symbols in ES6?ES6 中是否有命名符号的约定? 【发布时间】:2015-09-30 03:49:05 【问题描述】:我在玩 ES6,查看符号。不像 ruby 例如你会写:symbol
,ES6 符号似乎允许任何“标准”变量名。老实说,我觉得这很令人困惑:
var privateProperty = Symbol();
var obj = ;
obj[privateProperty] = 'some value goes here';
因为它倾向于让我认为privateProperty
可能像几年前一样是一个普通的字符串。使用:privateProperty
无效。
所以就像使用$bar
用于jQuery 对象或bar$
用于RxJS/Bacon 流一样,我想知道在ES6 中是否已经建立了命名符号的约定?
【问题讨论】:
符号只是一个值。您分配给它的变量不是它的名称。变量只是值的容器,就像任何其他值(数字、字符串、对象...)一样。 我知道,我的例子只是误导,编辑。 更改变量名并没有什么不同。 【参考方案1】:
obj[privateProperty] = …;
往往让我觉得privateProperty
可能像几年前一样是一个普通的字符串。
嗯,这是我们需要忘记的旧思想。 privateProperty
是一个 key,可以是字符串(属性 name)或符号。同样,我们已经学会了区分(整数)索引和“正常”属性。
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)"
)。
【讨论】:
持有对符号的引用的变量是什么?有时我将它们存储在对象中,但有时也存储在不同的变量中。当函数必须具有相同的名称时,我自己的代码中可能会出现名称冲突。我倾向于用大写字母写这些变量:const MAP = Symbol("map")
但我不确定。哦,符号是不可变的。
@IvenMarquardt 正如我所说,这些也没有约定。在你的情况下使用大写名称可能更多是因为它是一个常量,而不是因为它包含一个符号。以上是关于ES6 中是不是有命名符号的约定?的主要内容,如果未能解决你的问题,请参考以下文章