我最近发现了一条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 &&= 6; // Syntax error.
if(x == null && x == undefined) // No syntax errors.
if(x == null & x == undefined) // No syntax errors, but wrong operator usage?
有人可以对此有所了解吗?
答案 0 :(得分:8)
当像这样使用时,运算符&
和&&
都作为逻辑运算符工作(即使&
运算符实际上不是逻辑运算符)。实际差异在于&&
使用short circuit evaluation,而&
则不然。
使用&
运算符没有问题,只要可以计算第二个操作数,即使第一个操作数的计算结果为false。
当第一个操作数确定第二个操作数是否可以计算时,&&
运算符可用于保持第二个操作数不被计算。例如:
if (x != null && x.prop == 42) { ... }
这比检查一个,然后另一个更短:
if (x != null) {
if (x.prop == 42) { ... }
}
没有&&=
运算符,因为在这种情况下使用短路评估没有意义。
答案 1 :(得分:1)
expr1 & expr2
强制转换两个参数都转换为整数,然后计算它们的按位AND。如果是布尔值,则结果为0
或1
(非false
或true
)。零是假的,一个是真的,但仍然存在差异,因为两个参数总是被评估。
expr1 && expr2
返回expr1
,否则它会评估并返回expr2
。如果Expr2
是假的,则不会评估expr1
。
答案 2 :(得分:0)
在条件下使用二进制操作可能是有益的。
E.g。没有逻辑'XOR'运算符,而是二进制运算符:
if(cond1 ^ cond2){//如果一条且只有一条条件成立,则执行某项操作}
应用于布尔值的二元运算符将表达式计算为整数(为0或1),其中二进制运算有效且定义良好。
二进制操作也保证评估所有子表达式,其中&&
短路也会在表达式为假时停止评估。了解差异可以为问题选择最佳实践。
还有一个问题,为什么JavaScript允许字符串或对象进行比较:
if ("foo") { // is true }
if ("false") { // is also true }
if (null) { // is false }