2013-11-28 56 views
1

我對JavaScript如何將位掩碼轉換爲布爾表達式感到困惑,因此您可以直接在if語句中使用它們。我說,你有兩個變量x和y(使用Node.js的REPL):JavaScript如何將位掩碼轉換爲布爾表達式?

> 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語句中。什麼是顛覆規則或我在這裏錯過了什麼?

回答

1

有趣的問題。該if部分是比較容易回答:所有值除了falsenullNaN0undefined和空字符串""被認爲是truthy - (x & y)沒有任何那些在這種情況下,所以它被認爲是truthy。

> (x & y) == true 
false 

從EcmaScript的規範中,「抽象比較」或==作品這樣仰視當兩個操作數(被稱爲文檔中xy)是不同類型的,與右邊的操作數是一個布爾值:

如果Type(y)是布爾型,則返回比較結果x == ToNumber(y)。

因此,儘管大多數數值是truthy,只有當澆鑄數字類型的的true值在==感等於true。在我自己的JavaScript控制檯上測試,我從+true得到結果1,同樣,1 == true評估爲true

+0

嗯,我想這解釋了一切。雖然這有點尷尬。 ;) – alexraasch

+0

歡迎來到奇觀的JavaScript世界:) – kviiri

0

JavaScript中的if語句很容易成爲語言中最具爭議的特性之一,主要是因爲它實現了所謂的類型強制。所以,它會強制(x & y)(這是一個非零值)爲true,這就是您看到結果的原因。當你否定它時,你也會得到你想要的結果。它首先強制(x & y)爲真,然後否定它。

+0

是的,但是這種類型的強制力究竟如何工作?它是否構建在'if'語句或者'=='運算符中? – alexraasch

+1

@alexraasch這是if語句,如果它是你在測試中看到的'=='。 if語句強制或更精確地將所有表達式都減少爲布爾值,而不管它們是否被解釋爲是或不是。 'if(4){// true}; if('hello'){// true};如果(NULL){//假};等等,這已經給前端開發者多年帶來了很多麻煩。' – rdodev

+0

@rdodev這不是「它們是否意味着被解釋爲這樣或不是」的問題。在JavaScript中,與其他動態類型語言一樣,對象(以及在語言中的基元)已經定義了真值,這些值將用於期望布爾值的上下文中(並且您可以通過使用布爾值來明確地評估語句的真值)作爲一個函數而不是構造函數)。在我看來,真正的問題是JavaScript不支持自定義對象/自定義類/等的真值。 (例如Python 2中的'object .__ nonzero__',Python 3中的'object .__ bool__')。 – JAB

相關問題