JavaScript中的逻辑运算符——如何使用它们?

9

我不明白 &&, ||, 和 ! 在布尔值和其他数据类型中是如何工作的。你该如何使用它们?


紧密相关:JavaScript是否具有“短路”评估? - Sebastian Simon
2个回答

12
所有JavaScript中的值都是“真实值”或“虚假值”。
  • a && b 评估为第一个虚假操作数,
  • a || b 评估为第一个真实操作数。

这两个运算符不会评估返回之后的任何操作数。如果所有操作数都不匹配,则它们将评估为最后一个操作数。

  • !a 如果a是虚假的,则评估为true,如果a是真实的,则评估为false

所有值都是真值,除了以下的falsy

  • null
  • undefined
  • false
  • +0
  • -0
  • NaN
  • 0n
  • ""
  • document.all

1
应该写成“所有都是真实的...”,因为例如undefined是一个值,但还有一个变量undefined默认持有此值。另外NaN没有等于任何东西,甚至不等于自己。 - Ivo Wetzel
2
@Ivo:1:已修复。2:那个无关紧要;!NaNtrue,因此NaN是虚假的。 - SLaks
仍然 NaN == NaN 是 false。因此,从上面的列表中可以看出,NaN 仍然是一个特殊情况,有人可能认为 NaN 的工作方式与其他 falsy 值相同。 - Ivo Wetzel
3
@Ivo:SLaks只是列出了JavaScript中的假值,他并没有对NaN或其他任何值提出其他要求。 - Sasha Chedygov
我知道这已经是古老的历史了,但是document.all - Pointy
1
@Pointy - 这是网络历史的怪癖。 :-) 早期,document.all 是微软的专有属性,而 IE 不支持新兴的 DOM 标准,因此代码会这样写:if (document.all) { /* MS-specific code */ } else { /* DOM standard code */ }。时间过去了,A) 微软实现了 DOM 标准,B) 其他浏览器添加了 document.all 来支持无条件依赖它的代码。但是那些页面中的代码没有更新。为了避免像那样编写只针对 Microsoft 的分支的代码,Chrome 和 Firefox 将 document.all 设为 falsy。最终,IE 也这样做了。现在已经标准化了。 :-D - T.J. Crowder

1

如果你想测试两个条件都为真,则使用 &&:

if (isX && isY)
{
     // Do something.
}

如果你想测试两个条件中的一个或者两个都为真,那么使用 ||:

if (isX || isY)
{
     // Do something.
}

! 可以倒置一个布尔值(真值变为假,反之亦然)。


2
document.write("Cat"||"Dog") 是什么意思? - DarkLightA
@DarkLightA:我建议你不要写那样的代码!它会导致隐式转换,让所有人都感到困惑。 - Mark Byers
2
它不应该让任何人感到困惑。自从大约5年前,短路计算已经成为JavaScript中的常见习语。Crockford称||为默认运算符,因此"Cat" || "Dog"应该读作cat,默认为dog。个人而言,我将其解读为cat,否则dog - slebetman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接