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

Why I'm not getting an error when checking the length of null

本文关键字:错误 null 检查 为什么      更新时间:2024-05-31

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

最初,当返回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是一个falsy值(而nullfalsy),那么整个表达式将是falsy,并且不需要计算numberOfDigits.length

Falsy值为:undefinednull0''falseNaN。检查某个东西是否是假的一种方法是使用Boolean(falsyValue) === false(或者更实用但不那么详细的! falsyValue)。


这是&&运算符的副作用。我可以建议避免使用它,并将代码转换为可读的东西:

function checkLength(str) {
  let numberOfDigits = str.match(/'d/g);
  return Array.isArray(numberOfDigits) ? numberOfDigits.length : 0;
}

"解释器现在执行`numberOfDigits.length吗?"

否,JavaScript短路逻辑表达式-一旦结果已知(即and中的第一个操作数为假或or中的第一操作数为真),就不会在表达式中执行进一步的操作。

文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators

另外,请注意:&&||不一定会在JavaScript 中返回布尔值

原因是,当解释器看到与逻辑和(&&)连接的两个操作时,它将首先执行前者,而只有当它被求值为true时,它才会执行后者。

这就是为什么它发现numberOfDigits为null(在JS中相当于false),所以它停止执行,并且从未在numberOfDigits.length上崩溃。

反过来,当然会崩溃。

在逻辑OR(||)上,解释器将在第一个语句为true之后停止求值。

我认为原因是条件的顺序很重要。

首先计算numberOfDigits条件,因此如果为false,则不计算其余条件,也不会出现错误。

按照另一种顺序,您将尝试读取null的"length"属性,从而生成错误。

"And"逻辑将执行如下。

true & true = true  
false & anything = false`

如果第一个条件失败,那么执行第二个条件就没有意义了。因此如果CCD_ 31为空或未定义,则它不会执行CCD_。

(numberOfDigits && numberOfDigits.length) => false
     false      && anything               => false

同理,若第一个条件不为null,那个么它将执行第二个条件。

(numberOfDigits && numberOfDigits.length) => true
    true        && true (must be)         => true

注意:在javascript中,nullundefined被解释为false在条件语句中。

相关文章: