我对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语句中进行。什么是修改规则或我在这里缺少什么?
答案 0 :(得分:1)
有趣的问题。 if
部分更容易回答:除false
,null
,NaN
,0
,undefined
和空字符串{之外的所有值{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)为真,然后否定它。