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 == true
或x == 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
为空则返回空字符串。