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

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

我正在使用 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: 下面的答案解释说:

"Does the interpreter execute the `numberOfDigits.length now?"

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

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

另外,请注意:&&|| 不一定 return JavaScript

中的布尔值

JavaScript 尝试优化 && 运算符:

numberOfDigits && numberOfDigits.length

如果 numberOfDigits 是一个假值(并且 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 条件,因此如果该条件为假,则不会评估其余条件,您也不会收到错误。

在其他顺序中,您将尝试读取 null 的 "length" 属性,从而产生错误。

原因是当解释器看到两个逻辑与(&&)连接的操作时,它会先执行前者,只有当它被评估为真时然后它将执行后者。

这就是为什么它发现 numberOfDigits 为 null,在 JS 中等同于 false,它停止执行并且从不在 numberOfDigits.length.

上崩溃

反过来当然会崩溃。

在逻辑或 (||) 上,解释器将在第一个语句为真后停止计算。

"And"逻辑将执行如下。

true & true = true  
false & anything = false`

如果第一个条件失败,则没有必要执行第二个条件。 所以它不会执行 numberOfDigits.length 如果 numberOfDigits 为空或未定义所以在下面的情况下没有错误。

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

同理如果第一个条件不为空则执行第二个条件

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

Note : In javascript null and undefined are interpreted as false in conditional statements.