# 比较运算符

  • 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;
    

回到顶部