javascript if&&OR

javascript if&&OR,javascript,node.js,Javascript,Node.js,各位, 我有一个if语句,它应该检查err是否已定义,如果已定义,则查看它的ETIMEDOUT或ESOCKETTIMEDOUT 这在句法上是正确的吗 if (err && err.code === 'ETIMEDOUT' || 'ESOCKETTIMEDOUT') { } 或者它应该看起来像: if (err && (err.code === 'ETIMEDOUT' || 'ESOCKETTIMEDOUT')) { } 否,必须为针对变量的每次检查指定完整表达

各位, 我有一个if语句,它应该检查err是否已定义,如果已定义,则查看它的ETIMEDOUT或ESOCKETTIMEDOUT

这在句法上是正确的吗

if (err && err.code === 'ETIMEDOUT' || 'ESOCKETTIMEDOUT') {
}
或者它应该看起来像:

if (err && (err.code === 'ETIMEDOUT' || 'ESOCKETTIMEDOUT')) {
}

否,必须为针对变量的每次检查指定完整表达式

if (err && (err.code === 'ETIMEDOUT' ||  err.code === 'ESOCKETTIMEDOUT')) {

第一个检查just err的计算结果为布尔值,但仅检查'esocketimedout'的计算结果始终为true。

应该是这样的:

if (err && (err.code === 'ETIMEDOUT' || err.code === 'ESOCKETTIMEDOUT')) {
}
原因是在JavaScript中:

逻辑表达式从左到右求值

And&&operator将在err和err之间创建“连接”。代码===='ETIMEDOUT',而OR将接收:

err&&err.code=='ETIMEDOUT'| | err.code==='ESOCKETTIMEDOUT'


另一个问题是在第三个表达式中缺少err.code===,因为JavaScript中的字符串不是空的,所以它总是真的。

err&&err.code=='ETIMEDOUT'| | err.code=='ESOCKETTIMEDOUT'err.code=='ETIMEDOUT'| |'ESOCKETTIMEDOUT'是一个问题,因为err.code=='ETIMEDOUT'的计算结果要么是真的,要么是假的,但是“ESOCKETTIMEDOUT”没有。在发布到StackOverflow之前,请尝试在本地运行您的程序,或者甚至将结果作为JSFIDLE发布。如果你发现有错误,那么无论如何,继续问。但是自己测试逻辑很简单,即使通过打印console.log语句也是如此。正确的形式是x==y | | z==z。正如所写的,它相当于x==y | | z,这是没有意义的。是的,同样的语法错误有很多重复的地方。你的第一个代码在语法上是正确的,但在逻辑上不是正确的。这在逻辑上等同于just if err{},因为err.code=='ETIMEDOUT'| |'ESOCKETTIMEDOUT'将始终计算为真实值。哇,stackoverflow。哇。我想可能是一个人对多个答案投了否决票,因为其他答案中的一个也很快被否决了。公平地说,否决票是在你编辑答案之前出现的。你最初的回答只是添加括号,这不会以任何方式改变结果。我没有投票否决任何答案,只是出于我作为评论发布的原因。你被否决的一个原因是为了推广另一个类似的答案。我看到这个答案在发布后20秒内被否决了。我唯一的建议是在这个答案中提供更多的理由。比如,是的,你复制了OP要求的两个选项中的一个,但请解释为什么你的答案/选项会导致正确的逻辑结果。。。。鉴于你的答案是a先回答,b包括一个大括号,我将帮你投票支持你。