为什么我在检查 null 的长度时没有收到错误
Why I'm not getting an error when checking the length of null
我正在使用 match
和 length
属性检查字符串中的位数。这是我的函数 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
.
"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
是一个假值(并且 null
是 falsy),那么整个表达式将是 falsy 并且不需要计算 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;
}
我认为原因是条件的顺序很重要。
首先评估 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.
我正在使用 match
和 length
属性检查字符串中的位数。这是我的函数 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
.
"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
是一个假值(并且 null
是 falsy),那么整个表达式将是 falsy 并且不需要计算 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;
}
我认为原因是条件的顺序很重要。
首先评估 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
andundefined
are interpreted asfalse
in conditional statements.