为什么我在检查null的长度时没有收到错误

Pio*_*cki 8 javascript null logic string-length logical-operators

我正在使用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')  );
Run Code Online (Sandbox Code Playgroud)

更新1: 以下答案解释说:

  • &&表达式中操作数的顺序计数.
  • JavaScript优化了&&运算符,如果第一个操作数的计算结果为null,则JavaScript不会检查第二个操作数,因为表达式不能除了null/ 之外的其他值false.

Dmi*_*tin 6

JavaScript尝试优化&&运算符:

numberOfDigits && numberOfDigits.length
Run Code Online (Sandbox Code Playgroud)

如果numberOfDigits是假值(并且null假的),则整个表达式将是假的并且不需要评估numberOfDigits.length.

Falsy值是:undefined,null,0,'',false,NaN.检查某些东西是否有问题的一种方法是使用Boolean(falsyValue) === false(或更实用但更简洁! falsyValue).


这是&&操作员的副作用.我可以建议避免使用它并将代码转换为可读的东西:

function checkLength(str) {
  let numberOfDigits = str.match(/\d/g);
  return Array.isArray(numberOfDigits) ? numberOfDigits.length : 0;
}
Run Code Online (Sandbox Code Playgroud)

  • `Boolean(falsyValue)=== false`是写`!falsyValue`的一种相当冗长的方式. (2认同)
  • @DmitriPavlutin:新手可能更容易理解,但是`Boolean(falsyValue)=== false`不值得被称为"正确的方法"来进行检查.我们有太多人认为比较是一种不同的"词性",而不是价值观和做法,如`if(flag === true){return true;} else {return false;}`. (2认同)