为什么我'我在检查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
JavaScript试图优化&&
运算符:
numberOfDigits && numberOfDigits.length
如果numberOfDigits
是一个falsy值(而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.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中,
null
和undefined
被解释为false
在条件语句中。
- 未捕获的类型错误:无法读取属性'addEventListener'的null chrome扩展名
- 未捕获的类型错误:无法读取属性'状态'在react中为null
- 未捕获的类型错误:无法设置属性'innerHTML'如果为null,则将脚本移动到正文不会;不起作用
- 对象为null或IE9中存在未定义错误
- 我该如何解决这个问题?“未捕获的类型错误:无法读取 null 的属性'appendChild'”
- Microsoft JScript运行时错误:无法获取属性'的值;样式':对象为null或未定义
- VM5111:1249未捕获类型错误:无法读取属性'x'为null
- IE8错误:为null或不是对象,但仍然可以跟踪/控制台注销
- 未捕获的类型错误:无法设置属性'onclick'为null.已尝试window.onload
- node.js mongojs findOne回调返回错误为null
- 如果JS会话变量为null,如何避免500内部服务器错误
- 未捕获的类型错误:无法读取 null 的属性“removeChild”(使用 Instagram 的 JSONP 响应)
- 未捕获的类型错误:无法读取 null 的属性“toLowerCase”
- JAVASCRIPT - 未捕获的类型错误:无法读取 null 的属性“值”
- 未捕获的类型错误:无法读取 null 的属性“选项” - 某些代码有效
- 错误:“null”为空或不是IE8中的对象,而不是Chrome或Firefox
- Javascript 错误“Null 不是对象”,带有动态创建的 html 表
- 抛出TypeError错误:null不是一个对象(计算"$("body").append&
- Slick Carousel错误:null不是对象(求值'b.$slides.add')
- Javascript错误Null不是一个对象