2013-05-14 120 views
2

看到的結果,在谷歌Chrome瀏覽器打開控制檯,請執行下列操作:爲什麼在JavaScript中:obj = new Boolean(false),(obj && true)是true,(obj || false)是false?

obj = new Boolean(false) 
"obj && true: " + (obj && true) 
"obj || true: " + (obj || false) 

和:

(obj && true) == true // this is true 
(obj || false) == true // this is false 

爲什麼

(obj || false) 

的回報,而不是一個Boolean對象,布爾值?

(嗯..我也把內容摘要如下答案)

+0

我敢打賭,在最後一行的 「假」 是指'obj'。試試'obj || 0' – 2013-05-14 08:11:47

+0

我看到呈現給我的錯誤對象爲布爾{}' – 2013-05-14 08:14:00

+1

我沒有得到你所報告的內容。特別是'(obj || false)'返回'Boolean {}'。它測試爲一個真值:'!!(obj || false)'是'true'。請注意,'false'與'false'並不相同! – 2013-05-14 08:16:58

回答

3

有需要加以這裏考慮兩個概念:

obj = new Boolean(false) 

創建一個對象,其值是false。對象本身被認爲是真實的,它的價值(你得到的toString()valueOf())當然是布爾值false

(x||y) 

返回第truthy值(或者,如果不存在,最後falsy值)和

(x&&y) 

返回第falsy值(或者,如果不存在,最後truthy值)。

所以(obj||false)回報您Boolean對象(obj&&true)返回第二個(true)值。

更進一步的前景取決於你的表達的上下文。

"obj && true: " + (obj && true) 

需要一個字符串上下文,所以toString()叫你的Boolean對象,返回它的值,它是false(雖然對象本身是truthy!)。

此外,

(obj && true) == true比較true == true這當然是正確的。然而,

(obj || true) == true做了很多類型強制§11.9.3的並且比較

ToPrimitive(obj) == ToNumber(true)§9.1§9.3),這導致NaN == 1其產生錯誤的。

如果您使用嚴格的相等性運算符§11.9.6,結果會更具可預測性。

0

你的對象(obj)是一個包裹布爾和JavaScript對待它的方式。

(new Boolan(false)|| false)的確是假的。

1

在第一個示例中,您的obj評估爲truthy,因此評估爲truthy && true == true

在第二個示例中,評估對象時又被認爲是真實的,因此在評估obj後,懶惰評估停止。然後返回obj,它本身的值爲false

0

我的Chrome瀏覽器爲前聲明 返回true,並返回後者聲明

2

對於第一種情況的Boolean對象,該obj是truthy值,從而真正& &真正返回true。

對於第二種情況,它返回obj,它是Boolean{}。如果您將其轉換爲字符串(發生這種情況,如果您的輸入是"string" + (obj || false)),那麼它將返回,這是「false」。

再次,這是因爲objfalse但對象本身就是一個truthy價值!

+0

問題更新 – 2013-05-14 08:18:57

+1

答案更新:) – 2013-05-14 08:22:26

+0

Thx的答覆。爲什麼(obj || false)返回一個布爾對象而不是布爾值? – songyy 2013-05-14 08:24:28

0

得到以下問題的答案後,讓我做一個總結這裏(在計算器上的人是真正有用的〜謝謝大家〜):

的& &和短切行爲||運算符,以及對象的真實值,這是我猜測問題的根源。

(下面是我從幾個行爲我試圖總結)

我會用:

o = new Object; 
t = new Boolean(true); 
f = new Boolean(false); 

當||被使用,它會採取第一個非錯誤值。因爲:

(f || t) == true; // false 
(t || f) == true; // true 
(false || f) == true; // false 
typeof (false || f); // "object" 
typeof (true || f); // "boolean" 

當使用& &,它會採取的第一個非真正的價值。由於對象本質上是真實的,所以它會嘗試返回最後發生的對象,或者如果存在,則返回第一個假。

下面是一個例子:

(o || t) // it returns the 'o' since it's the first true 
(o && t) // it returns t since it's the last true 
(true && t) // it returns t also, same reason 
(false && t) // it returns false since it's the first occurring false. 
相關問題