JavaScript短路评估错误?

JavaScript短路评估错误?,javascript,conditional-statements,conditional-operator,typeof,short-circuiting,Javascript,Conditional Statements,Conditional Operator,Typeof,Short Circuiting,下面两段JS代码让我感到困惑,在我看来,由于短路评估,这两段代码应该是一样的。但由于某些原因,代码段“1”导致错误(在第三行): 无法读取未定义的属性“match” 数组“a”包含用户输入的3个字符值。如果字符未定义、为空字符串或字母或数字,我希望代码返回true 需要明确的是,当a=['a','/']时,这会失败 片段1) 片段2) 如果[2]由于“if”中的第一个条件而未定义,则绝对不应计算[2]。匹配项。答案很简单。请看下面的图片。 并且绑定超过或 在代码段1中,表达式如下所示: a1 |

下面两段JS代码让我感到困惑,在我看来,由于短路评估,这两段代码应该是一样的。但由于某些原因,代码段“1”导致错误(在第三行):

无法读取未定义的属性“match”

数组“a”包含用户输入的3个字符值。如果字符未定义、为空字符串或字母或数字,我希望代码返回true

需要明确的是,当a=['a','/']时,这会失败

片段1)

片段2)


如果[2]由于“if”中的第一个条件而未定义,则绝对不应计算[2]。匹配项。

答案很简单。请看下面的图片。 并且绑定超过或

在代码段1中,表达式如下所示:

a1 || b1 || (c1 && a2) || b2 || (c2 && a3) || b3 || c3
您的代码片段2类似于:

(a1 || b1 || c1) && (a2 || b2 || c2) && (a3 || b3 || c3)

@Christoph是对的,但您还需要添加类似!==匹配后为空

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);

你可以看看这把小提琴,它实现了你的问题

如果[0]没有定义,它肯定不会计算[0]。匹配(/^[a-z0-9]+$/i)==空对吧?通常不会。如果有多个表达式或遇到第一个true条件,则无需继续计算其余表达式。当你得到第一个false时,你可以停下来。你的答案是a1==a[0]?b1==a[1]?不,在me中,答案a1是“a[0]===‘未定义’”,b1是“a[0]==”
(a1 || b1 || c1) && (a2 || b2 || c2) && (a3 || b3 || c3)
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);