JavaScript 编码风格

编码风格

使用 prettier 工具重新格式化 JavaScript 代码。

方法和函数

在 JavaScript 中,函数应使用 camelCase 命名,但首字母不应大写。方法不应使用具名函数表达式语法,因为我们的工具可以识别方法名称。

doSomething: function (aFoo, aBar) {
  ...
}

内联函数的大括号前后应有空格,但逗号或分号前除外。

function valueObject(aValue) { return { value: aValue }; }

JavaScript 对象

var foo = { prop1: "value1" };

var bar = {
  prop1: "value1",
  prop2: "value2"
};

对象的构造函数应首字母大写,并使用 PascalCase 命名。

function ObjectConstructor() {
  this.foo = "bar";
}

运算符

在 JavaScript 中,过长的表达式(未用 &&|| 连接)应换行,使运算符位于第二行,并与第一行表达式开头对齐。这适用于 ?:、二元算术运算符(包括 +)和成员运算符。理由:运算符位于续行的开头,可以更快地进行视觉扫描,因为无需读取到行尾。此外,JavaScript 中存在上下文相关的关键字危害;参见 {{bug(442099, “bug”, 19)}},可以通过将 . 放在续行开头来避免此问题,用于长成员表达式。

在 JavaScript 中,===== 更受欢迎。

一元关键字运算符(例如 typeof)的操作数应使用括号括起来;例如 typeof("foo") == "string"

字面量

在 JavaScript 中,双引号字符串(例如 "foo")比单引号字符串(例如 'foo')更受欢迎,除非要避免转义嵌入的双引号,或者在分配内联事件处理程序时。

前缀

  • k=常量(例如 kNC_child)。并非所有代码都使用此风格;一些代码使用 ALL_CAPS 表示常量。

  • g=全局(例如 gPrefService

  • a=参数(例如 aCount

  • JavaScript 特定前缀

    • _=成员(变量或函数)(例如 _length_setType(aType)

    • k=枚举值(例如 const kDisplayModeNormal = 0

    • on=事件处理程序(例如 function onLoad()

    • 接口名称的便利常量应以 nsI 为前缀。

      const nsISupports = Components.interfaces.nsISupports;
      const nsIWBN = Components.interfaces.nsIWebBrowserNavigation;
      

其他建议

  • 不要比较 x == truex == false。请改用 (x)(!x)x == true 肯定与 if (x) 不同!如果可能存在混淆,请将对象与 null 比较,将数字与 0 比较,将字符串与 "" 比较。

  • 确保代码不会生成任何严格的 JavaScript 警告,例如

    • 重复的变量声明。

    • 混合使用 return;return value;

    • 未声明的变量或成员。如果您不确定数组值是否存在,请将索引与数组的长度进行比较。如果您不确定对象成员是否存在,请在 aObject 中使用 "name",或者如果您期望特定的类型,可以使用 typeof(aObject.name) == "function"(或您期望的任何类型)。

  • 使用 ['value1, value2'] 创建 JavaScript 数组,而不是使用 new {{JSxRef("Array", "Array", "Syntax", 1)}}(value1, value2),后者可能会令人困惑,因为 new Array(length) 实际上会创建一个具有给定逻辑长度的物理空数组,而 [value] 始终会创建一个包含 1 个元素的数组。您实际上无法保证能够为数组预分配内存。

  • 使用 { member: value, ... } 创建 JavaScript 对象;与 new {{JSxRef("Object", "Object", "", 1)}}() 相比,一个有用的优势是可以创建初始属性并使用扩展的 JavaScript 语法来定义 getter 和 setter。

  • 如果在定义构造函数后需要分配默认属性,建议将对象字面量分配给 prototype 属性。

  • 使用正则表达式,但要谨慎使用。例如,要检查 aString 是否完全为空格,请使用 /\S/.{{JSxRef("RegExp.test", "test(aString)", "", 1)}}。仅当您需要知道结果的位置时才使用 {{JSxRef(“String.search”, “aString.search()”)}},或者当您需要收集匹配的子字符串(由正则表达式中的括号分隔)时才使用 {{JSxRef(“String.match”, “aString.match()”)}}。如果预先不知道匹配项或要提取字符串中已知位置的子字符串,则正则表达式不太有用。例如,{{JSxRef(“String.slice”, “aString.slice(-1)”)}} 返回 aString 中的最后一个字母,或者如果 aString 为空则返回空字符串。