为什么JavaScript同时允许&&;(逻辑)及&;(按位)在条件语句中?
我最近发现了一段javascript,其计算结果为null/undefined,如下所示:为什么JavaScript同时允许&&;(逻辑)及&;(按位)在条件语句中?,javascript,conditional,logical-operators,Javascript,Conditional,Logical Operators,我最近发现了一段javascript,其计算结果为null/undefined,如下所示: // The single & is on purpose! if(x !== null & x !== undefined) { // Do this... } 对我来说,这看起来是一个非常糟糕的做法,但似乎奏效了 据我所知,这些操作员应执行两项不同的任务: var x = 3; x &= 6; // No syntax errors. var x = 3; x &a
// The single & is on purpose!
if(x !== null & x !== undefined) {
// Do this...
}
对我来说,这看起来是一个非常糟糕的做法,但似乎奏效了
据我所知,这些操作员应执行两项不同的任务:
var x = 3; x &= 6; // No syntax errors.
var x = 3; x &&= 6; // Syntax error.
if(x == null && x == undefined) // No syntax errors.
if(x == null & x == undefined) // No syntax errors, but wrong operator usage?
有人能解释一下吗?这样使用时,运算符
&
和&
都是逻辑运算符(即使&
运算符实际上不是逻辑运算符)。实际的区别是&
使用,而&
不使用
使用&
运算符没有问题,只要可以计算第二个操作数,即使第一个操作数的计算结果为false
当第一个操作数确定第二个操作数是否可以求值时,可以使用&&&
运算符阻止对第二个操作数求值。例如:
if (x != null && x.prop == 42) { ... }
这比必须先检查一个,然后检查另一个要短:
if (x != null) {
if (x.prop == 42) { ... }
}
没有
&&=
运算符,因为在这种情况下使用短路评估是没有意义的。在条件下使用二进制操作是有益的
例如,没有逻辑“异或”运算符,而是二进制运算符:
如果(cond1^cond2){//如果其中一个且只有一个条件为真,则执行某些操作}
应用于布尔运算的二进制运算符将表达式计算为整数(到0或1),其中二进制运算有效且定义良好
此外,二进制操作保证所有要求值的子表达式,其中as&&
短路aka在表达式为false时停止求值。了解差异可以为问题选择最佳实践
还有人可能会问,为什么JavaScript允许比较字符串或对象:
if ("foo") { // is true }
if ("false") { // is also true }
if (null) { // is false }
expr1&expr2
强制转换这两个参数都强制转换为整数,然后计算它们的位和。对于布尔型,结果是0
或1
(不是false
或true
)。零是虚假的,一是真实的,但仍然有一个区别,这两个参数总是被计算的
expr1&&expr2
如果错误,则返回expr1
,否则计算并返回expr2
<如果expr1
是错误的,则不会计算code>Expr2。它不是条件AND和逻辑AND,而是逻辑AND(&&)和二进制AND(&)。@WTK-根据注释更新了标题。这让我明白了。我在测试这样的标志:27&4==0?false:true
输出true
而(27和4)==0?false:true
按预期输出false。true&true==1
,nottrue&true==true
@JanDvorak:是的,&
运算符不是实际的逻辑运算符,但与两个布尔值一起使用时,它作为逻辑运算符工作。我在答复中补充了一项澄清。