以下两个JS代码段令我感到困惑,在我看来,由于短路评估,两者都应该一样。但由于某种原因,片段“1”导致错误(在第三行):
无法读取未定义的属性“匹配”
数组'a'包含用户在输入中输入的3个字符值。如果char未定义,空字符串或字母或数字,我希望代码返回true。
要清楚,当a = ['a','/'];
时会失败Snippet 1)
return typeof a[0] === 'undefined' || a[0] === '' || a[0].match(/^[a-z0-9]+$/i)
&& typeof a[1] === 'undefined' || a[1] === '' || a[1].match(/^[a-z0-9]+$/i)
&& typeof a[2] === 'undefined' || a[2] === '' || a[2].match(/^[a-z0-9]+$/i);
Snippet 2)
if (typeof a[0] === 'undefined' || a[0] === '' || a[0].match(/^[a-z0-9]+$/i)) {
if (typeof a[1] === 'undefined' || a[1] === '' || a[1].match(/^[a-z0-9]+$/i)) {
if (typeof a[2] === 'undefined' || a[2] === '' || a[2].match(/^[a-z0-9]+$/i)) {
return true;
}
return false;
}
return false;
}
return false;
当由于'if'中的第一个条件而未定义[2]时,永远不应该评估[2] .match吗?
答案 0 :(得分:4)
答案很简单。看看order of operations。 AND绑定超过OR。
在您的代码段1中,表达式如下:
a1 || b1 || (c1 && a2) || b2 || (c2 && a3) || b3 || c3
您的代码段2就像:
(a1 || b1 || c1) && (a2 || b2 || c2) && (a3 || b3 || c3)
答案 1 :(得分:1)
@Christoph是对的,但你还需要在匹配后添加类似!== null的内容,如
return (typeof a[0] === 'undefined' || a[0] === '' || a[0].match(/^[a-z0-9]+$/i) !==null ) && (typeof a[1] === 'undefined' || a[1] === '' || a[1].match(/^[a-z0-9]+$/i) !== null ) && (typeof a[2] === 'undefined' || a[2] === '' || a[2].match(/^[a-z0-9]+$/i) !== null);
你可以看看这个实现你的问题的小提琴http://jsfiddle.net/dv360q1p/1/