Pio*_*cki 8 javascript null logic string-length logical-operators
我正在使用match和length属性检查字符串中的位数.这是我的函数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: 以下答案解释说:
&&表达式中操作数的顺序计数.&&运算符,如果第一个操作数的计算结果为null,则JavaScript不会检查第二个操作数,因为表达式不能除了null/ 之外的其他值false.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)