Skip to Content
JavaScript6 命名

6 命名

6.1 所有标识符的通用规则

标识符仅使用 ASCII 字母和数字,在下面注明的少数情况下使用下划线,很少情况下(当框架如 Angular 要求时)使用美元符号。

在合理范围内,尽可能给出描述性的名称。不要担心节省水平空间,因为让新读者立即理解你的代码远比这更重要。不要使用对项目外部读者来说模糊或不熟悉的缩写,也不要通过删除单词中的字母来缩写。

errorCount // No abbreviation. dnsConnectionIndex // Most people know what "DNS" stands for. referrerUrl // Ditto for "URL". customerId // "Id" is both ubiquitous and unlikely to be misunderstood.

不允许:

n // Meaningless. nErr // Ambiguous abbreviation. nCompConns // Ambiguous abbreviation. wgcConnections // Only your group knows what this stands for. pcReader // Lots of things can be abbreviated "pc". cstmrId // Deletes internal letters. kSecondsPerDay // Do not use Hungarian notation.

例外:作用域不超过 10 行的变量(包括属于导出 API 的参数)可以使用短的(例如单字母)变量名。

6.2 按标识符类型的规则

6.2.1 包名

包名全部使用 lowerCamelCase。例如,my.exampleCode.deepSpace,而不是 my.examplecode.deepspacemy.example_code.deep_space

例外:包名可以符合 TypeScript 基于路径的模式。这通常是全小写的,并在文件名中存在下划线时使用下划线。

6.2.2 类名

类、接口、recordtypedef 名称使用 UpperCamelCase 编写。未导出的类只是局部的:它们不标记 @private

类型名称通常是名词或名词短语。例如,RequestImmutableViewVisibilityMode。此外,接口名称有时可以是形容词或形容词短语(例如 Readable)。

6.2.3 方法名

方法名使用 lowerCamelCase 编写。@private 方法的名称可以选择性地以尾随下划线结尾。

方法名通常是动词或动词短语。例如,sendMessagestop_。属性的 getter 和 setter 方法从来不是必需的,但如果使用它们,应命名为 getFoo(或对布尔值可选地使用 isFoohasFoo),setter 命名为 setFoo(value)

下划线也可以出现在 JsUnit 测试方法名中,以分隔名称的逻辑组件。一种典型的模式是 test<MethodUnderTest>_<state>_<expectedOutcome>,例如 testPop_emptyStack_throws。命名测试方法没有唯一正确的方式。

6.2.4 枚举名

枚举名使用 UpperCamelCase 编写,类似于类,通常应该是单数名词。枚举中的各个项使用 CONSTANT_CASE 命名。

6.2.5 常量名

常量名使用 CONSTANT_CASE:全部大写字母,单词之间用下划线分隔。没有理由用尾随下划线命名常量,因为私有静态属性可以被(隐式私有的)模块本地变量替代。

6.2.5.1 “常量”的定义

每个常量是 @const 静态属性或模块本地 const 声明,但不是所有 @const 静态属性和模块本地 const 都是常量。在选择常量命名之前,考虑该字段是否真的感觉像一个深度不可变的常量。例如,如果该实例的任何可观察状态可以改变,它几乎肯定不是常量。仅仅打算永不修改该对象通常是不够的。

示例:

// Constants const NUMBER = 5; /** @const */ exports.NAMES = goog.debug.freeze(['Ed', 'Ann']); /** @enum */ exports.SomeEnum = { ENUM_CONSTANT: 'value' }; // Not constants let letVariable = 'non-const'; class MyClass { constructor() { /** @const {string} */ this.nonStatic = 'non-static'; } }; /** @type {string} */ MyClass.staticButMutable = 'not @const, can be reassigned'; const /** Set<string> */ mutableCollection = new Set(); const /** MyImmutableContainer<SomeMutableType> */ stillMutable = new MyImmutableContainer(mutableInner); const {Foo} = goog.require('my.foo'); // mirrors imported name const logger = log.getLogger('loggers.are.not.immutable');

常量的名称通常是名词或名词短语。

6.2.5.2 局部别名

只要局部别名比完全限定名称更能提高可读性,就应使用局部别名。遵循与 goog.require 相同的规则(??),保持别名的最后部分。别名也可以在函数中使用。别名必须是 const

示例:

const staticHelper = importedNamespace.staticHelper; const CONSTANT_NAME = ImportedClass.CONSTANT_NAME; const {assert, assertInstanceof} = asserts;

6.2.6 非常量字段名

非常量字段名(静态或其他)使用 lowerCamelCase 编写,私有字段可选择带尾随下划线。

这些名称通常是名词或名词短语。例如,computedValuesindex_

6.2.7 参数名

参数名使用 lowerCamelCase 编写。请注意,即使参数期望构造函数也是如此。

公共方法中不应使用单字符参数名。

例外:当第三方框架要求时,参数名可以以 $ 开头。此例外不适用于任何其他标识符(例如局部变量或属性)。

6.2.8 局部变量名

局部变量名使用 lowerCamelCase 编写,如上所述,模块本地(顶级)常量除外。函数作用域中的常量仍然使用 lowerCamelCase 命名。请注意,即使变量持有构造函数也使用 lowerCamelCase

6.2.9 模板参数名

模板参数名应该是简洁的、单词或单字母标识符,且必须全部大写,如 TYPETHIS

6.2.10 模块本地名称

未导出的模块本地名称是隐式私有的。它们不标记 @private。这适用于类、函数、变量、常量、枚举和其他模块本地标识符。

6.3 驼峰命名法(Camel case):定义

有时将英语短语转换为驼峰命名法有多种合理的方式,例如当存在缩写或不寻常的结构(如 “IPv6” 或 “iOS”)时。为了提高可预测性,Google 风格指定了以下(几乎)确定性的方案。

从名称的散文形式开始:

  1. 将短语转换为纯 ASCII 并去除任何撇号。例如,“Muller’s algorithm” 可能变成 “Muellers algorithm”。
  2. 将结果分成单词,在空格和任何剩余的标点符号(通常是连字符)处分割。
    1. 建议:如果任何单词在通常使用中已经具有传统的驼峰命名法外观,则将其拆分为组成部分(例如,“AdWords” 变成 “ad words”)。请注意,像 “iOS” 这样的单词本身并不真正是驼峰命名法;它违反了任何约定,因此此建议不适用。
  3. 现在将所有内容转为小写(包括首字母缩写词),然后仅将以下内容的首字符转为大写:
    1. ……每个单词,产生 UpperCamelCase,或
    2. ……除第一个外的每个单词,产生 lowerCamelCase
  4. 最后,将所有单词连接成一个标识符。

请注意,原始单词的大小写几乎完全被忽略。

lowerCamelCase 的示例:

散文形式正确不正确
“XML HTTP request”xmlHttpRequestXMLHTTPRequest
“new customer ID”newCustomerIdnewCustomerID
“inner stopwatch”innerStopwatchinnerStopWatch
“supports IPv6 on iOS?”supportsIpv6OnIossupportsIPv6OnIOS
“YouTube importer”youTubeImporteryoutubeImporter*

*可接受,但不推荐。

对于 UpperCamelCase 的示例,将每个正确的 lowerCamelCase 示例的首字母大写。

注意:有些单词在英语中的连字符使用是模糊的:例如 “nonempty” 和 “non-empty” 都是正确的,所以方法名 checkNonemptycheckNonEmpty 同样都是正确的。

Last updated on