JavaScript 短路评估错误?
JavaScript short circuit evaluation error?
下面两个 JS 代码片段让我感到困惑,在我看来,由于短路评估,两者应该工作相同。但由于某种原因,片段“1”导致错误(在第三行):
无法读取未定义的 属性'match'
数组 'a' 包含用户输入的 3 个字符值。如果 char 未定义、空字符串或字母或数字,我希望代码 return 为真。
需要说明的是,当 a = ['a', '/'];
时失败
片段 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);
片段 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;
当然,如果 a[2] 由于 'if'?
中的第一个条件而未定义,则永远不应评估 a[2].match
答案很简单。看看 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)
@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);
你可以看看这个 fiddle http://jsfiddle.net/dv360q1p/1/ 它实现了你的问题
下面两个 JS 代码片段让我感到困惑,在我看来,由于短路评估,两者应该工作相同。但由于某种原因,片段“1”导致错误(在第三行):
无法读取未定义的 属性'match'
数组 'a' 包含用户输入的 3 个字符值。如果 char 未定义、空字符串或字母或数字,我希望代码 return 为真。
需要说明的是,当 a = ['a', '/'];
时失败片段 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);
片段 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;
当然,如果 a[2] 由于 'if'?
中的第一个条件而未定义,则永远不应评估 a[2].match答案很简单。看看 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)
@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);
你可以看看这个 fiddle http://jsfiddle.net/dv360q1p/1/ 它实现了你的问题