2

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

任何人都可以对此有所了解吗?

4

3 回答 3

8

当这样使用时,运算符&和逻辑运算符都&&可以作为逻辑运算符(即使&运算符实际上不是逻辑运算符)。实际的区别是&&使用短路评估,而&不是。

使用运算符没有问题&,只要即使第一个操作数的计算结果为假,也可以计算第二个操作数。

&&当第一个操作数确定第二个操作数是否可以计算时,该运算符可用于阻止对第二个操作数进行计算。例如:

if (x != null && x.prop == 42) { ... }

这比必须检查一个,然后另一个要短:

if (x != null) {
  if (x.prop == 42) { ... }
}

没有&&=操作员,因为在这种情况下使用短路评估没有意义。

于 2012-11-19T09:29:00.020 回答
1

expr1 & expr2casts 两个参数都被转换为整数,然后计算它们的按位与。在布尔值的情况下,结果是0or 1(NOT falseor true)。零是虚假的,一个是真实的,但仍然存在差异,即始终对两个参数进行评估。

expr1 && expr2如果它是假的则返回expr1,否则它评估并返回expr2Expr2如果expr1是假的,则不评估。

于 2012-11-19T09:33:46.667 回答
0

在条件下使用二元运算可能是有益的。

例如,没有逻辑“XOR”运算符,而是一个二元运算符:

if (cond1 ^ cond2) { // 如果一个且只有一个条件为真,则做某事 }

应用于布尔值的二元运算符将表达式计算为整数(为 0 或 1),其中二元运算有效且定义明确。

此外,二元运算保证所有子表达式都被评估,其中&&短路也就是当表达式为假时停止评估。了解差异允许为问题选择最佳实践。

也有人可能会质疑,为什么 JavaScript 允许字符串或对象比较:

if ("foo") { // is true }
if ("false") { // is also true }
if (null) { // is false }
于 2012-11-19T09:33:24.320 回答