# 比较运算符
15.1 用
===
和!==
而不是==
和!=
. eslint:eqeqeq
(opens new window)15.2 条件语句如'if'语句使用强制`ToBoolean'抽象方法来评估它们的表达式,并且始终遵循以下简单规则:
Objects 计算成 true
Undefined 计算成 false
Null 计算成 false
Booleans 计算成 the value of the boolean
Numbers
- +0, -0, or NaN 计算成 false
- 其他 true
Strings
''
计算成 false- 其他 true
if ([0] && []) { // true // 数组(即使是空数组)是对象,对象会计算成true }
15.3 布尔值用缩写,而字符串和数字要明确比较对象
// bad if (isValid === true) { // ... } // good if (isValid) { // ... } // bad if (name) { // ... } // good if (name !== '') { // ... } // bad if (collection.length) { // ... } // good if (collection.length > 0) { // ... }
15.4 更多信息请见Angus Croll的真理、平等和JavaScript —— Truth Equality and JavaScript (opens new window)
15.6 三元表达式不应该嵌套,通常是单行表达式。
eslint rules:
no-nested-ternary
(opens new window).// bad const foo = maybe1 > maybe2 ? "bar" : value1 > value2 ? "baz" : null; // better const maybeNull = value1 > value2 ? 'baz' : null; const foo = maybe1 > maybe2 ? 'bar' : maybeNull; // best const maybeNull = value1 > value2 ? 'baz' : null; const foo = maybe1 > maybe2 ? 'bar' : maybeNull;
15.7 避免不需要的三元表达式
eslint rules:
no-unneeded-ternary
(opens new window).// bad const foo = a ? a : b; const bar = c ? true : false; const baz = c ? false : true; // good const foo = a || b; const bar = !!c; const baz = !c;
15.8 用圆括号来混合这些操作符。 只有当标准的算术运算符(
+
,-
,*
, &/
), 并且它们的优先级显而易见时,可以不用圆括号括起来。 eslint:no-mixed-operators
(opens new window)Why? 这提高了可读性,并且明确了开发者的意图
// bad const foo = a && b < 0 || c > 0 || d + 1 === 0; // bad const bar = a ** b - 5 % d; // bad // 别人会陷入(a || b) && c 的迷惑中 if (a || b && c) { return d; } // good const foo = (a && b < 0) || c > 0 || (d + 1 === 0); // good const bar = (a ** b) - (5 % d); // good if (a || (b && c)) { return d; } // good const bar = a + b / c * d;