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 中是不是有命名符号的约定?的主要内容,如果未能解决你的问题,请参考以下文章

REST API 是不是有任何命名约定准则? [关闭]

在 Python 中测试文件名是不是具有正确的命名约定

在 Prisma 中命名关系的正确方法是啥?是不是有我应该遵循的指导方针或约定?

ECMAScript 6 是不是有抽象类的约定? [复制]

您是不是使用与私有变量相同的约定来命名表单上的控件?

从 XMLNode 中选择是不是算作 SQL Server 中的 3 部分命名约定?