This question already has answers here:
Does a javascript if statement with multiple conditions test all of them?

(9个答案)


4年前关闭。




我正在使用matchlength属性检查字符串中的位数。这是带有我的函数http://codepen.io/PiotrBerebecki/pen/redMLE的codepen

最初,当返回numberOfDigits.length时,我收到一条错误消息(Cannot read property 'length' of null)。我已通过将行更改为(numberOfDigits && numberOfDigits.length)解决了此问题。
这可行,但我想更好地理解为什么现在可以执行新语句。解释器现在执行`numberOfDigits.length吗?

另外,当操作数反转为(numberOfDigits.length && numberOfDigits)时,为什么会出现相同的错误?

这是完整的JavaScript代码:
function checkLength(str) {
  let numberOfDigits = str.match(/\d/g);
  return (numberOfDigits && numberOfDigits.length);
}

console.log(  checkLength('T3xt w1th sOme numb3rs')  );
console.log(  checkLength('Text with some numbers')  );

更新1:
以下答案说明:
  • &&表达式中的操作数顺序计数。
  • JavaScript优化了&&运算符,如果第一个操作数求值为null,则JavaScript不会检查第二个操作数,因为该表达式除null / false以外,其他任何取值都不能求值。
  • 最佳答案

    JavaScript尝试优化&&运算符:

    numberOfDigits && numberOfDigits.length
    

    如果numberOfDigits是一个伪造的值(而null是伪造的),则整个表达式将是伪造的,不需要评估numberOfDigits.length

    伪造的值是:undefinednull0''falseNaN。检查某些事物是否虚假的一种方法是使用Boolean(falsyValue) === false(或更实用,但不太冗长的! falsyValue)。

    这是&&运算符的副作用。我可以建议避免使用它,并将代码转换为可读的内容:
    function checkLength(str) {
      let numberOfDigits = str.match(/\d/g);
      return Array.isArray(numberOfDigits) ? numberOfDigits.length : 0;
    }
    

    07-26 08:00