JavaScript如何将位掩码转换为布尔表达式?

时间:2013-11-28 19:05:14

标签: if-statement bitmask

我对JavaScript如何将bitmasks转换为布尔表达式感到困惑,因此您可以直接在if语句中使用它们。比如,你有两个变量,x和y(使用Node.JS REPL):

> var x = 0x4;

> var y = 0x5;

现在你和他们一起得到

> x & y
4

现在你要比布尔语:

> (x & y) == true
false
> (x & y) == false
false

但是当你将位掩码放在if语句中时,它就像魅力一样:

> if (x & y) { z = 3; } else { z = 7; }
3
> if (! (x & y)) { z = 3; } else { z = 7; }
7

所以我的问题是:尽管表达式x & y不与布尔值进行比较,但它在if语句中进行。什么是修改规则或我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

有趣的问题。 if部分更容易回答:除falsenullNaN0undefined和空字符串{之外的所有值{1}}被认为是真实的 - ""在这种情况下不属于任何一个,所以它被认为是真实的。

(x & y)

从EcmaScript规范中查看,当文档中的两个操作数(称为> (x & y) == true false ==)不同时,“抽象比较”或x的工作方式与此类似类型,右侧操作数是布尔值:

  

如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。

因此,虽然大多数数值都是真实的,但只有y在投放到数字类型时的值等于true意义上的true。在我自己的JavaScript控制台上测试,我从==得到结果1,同样,+true评估为1 == true

答案 1 :(得分:0)

JavaScript中的if语句很容易成为该语言最受争议的功能之一,主要是因为它执行了所谓的类型强制。因此,它会强制(x& y),这是一个非零值,为true,这就是你看到结果的原因。当你否定它时,你也会得到你想要的结果。它首先强制(x& y)为真,然后否定它。