2013-08-28 70 views
0

有人能向我解釋爲什麼...(這是在Chrome控制檯)Falsy價值觀與Coersion

空==虛假//假

!空==虛假//假

[]? 'hello':'goodbye'//'hello'

[] == true? 'hello':'goodbye'//'goodbye'

我可以想出更多,但基本上如何到達這些結果?

+0

的可能重複的[JavaScript的類型轉換(http://stackoverflow.com/questions/4626361/javascript-type-casting) – Bergi

回答

2

的JavaScript做了很多類型的鑄件,其並不明顯不知道它(JavaScript equality transitivity is weird) 。

! NOT運算符,Boolean功能,? :三元運算符,if -clauses和邏輯AND/OR操作確實使用了內部ToBoolean conversion - 這是什麼是我們生產的falsy價值0的理解,NaN""nullundefinedfalse

但是,當您比較事物時,(non-strict) equality comparsion algorithm開始起作用,在比較對角線類型時會產生一些看似奇怪的結果。你的情況:

  • null僅相當於自身或undefined但不false
  • 當您比較數組對象爲布爾值,它也越來越複雜。布爾獲得相對於其他類型的,好像他們是數字,即true被強制轉換爲1第一。然後,當一個對象與一個數字進行比較時,它將被鑄造爲to a primitive value(沒有首選類型) - 調用DefaultValue algorithm,其實質上是調用arrays' .toString method,這將.join() it。所以[]被鑄造爲"" - 然後傳遞給ToNumber,因爲它將與1進行比較。最後0不是1。然而,[] == false[1] == true["1"] == true保持...
0

魔術 *波手中神祕*

在一個更嚴重的是,第二,!運營商呼籲toBooleannull,因此,如果您選中!null == !false!!null == false你應該得到true。其他情況可能發生類似的情況。

隨着由Tore漢森提供的信息,我們可以回答另外兩個爲好。 []是一個'truthy'值,但不是布爾值,所以直接將它與真實的返回值false進行比較。但是,您可以使用!運營商再次使其成爲布爾,所以!![] == true返回true

+1

與其他情況下,一個空數組是不是未定義或null,所以它返回true,但它不是一個布爾==真,所以這就是爲什麼它說再見 –

+0

@ToreHanssen啊,所以它是類似的東西:)謝謝你讓我知道! – Jordan