Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JavaScript同时允许&&;(逻辑)及&;(按位)在条件语句中?_Javascript_Conditional_Logical Operators - Fatal编程技术网

为什么JavaScript同时允许&&;(逻辑)及&;(按位)在条件语句中?

为什么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

我最近发现了一段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?

有人能解释一下吗?

这样使用时,运算符
&
&
都是逻辑运算符(即使
&
运算符实际上不是逻辑运算符)。实际的区别是
&
使用,而
&
不使用

使用
&
运算符没有问题,只要可以计算第二个操作数,即使第一个操作数的计算结果为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
,not
true&true==true
@JanDvorak:是的,
&
运算符不是实际的逻辑运算符,但与两个布尔值一起使用时,它作为逻辑运算符工作。我在答复中补充了一项澄清。