有人能向我解釋爲什麼...(這是在Chrome控制檯)Falsy價值觀與Coersion
空==虛假//假
!空==虛假//假
[]? 'hello':'goodbye'//'hello'
[] == true? 'hello':'goodbye'//'goodbye'
我可以想出更多,但基本上如何到達這些結果?
有人能向我解釋爲什麼...(這是在Chrome控制檯)Falsy價值觀與Coersion
空==虛假//假
!空==虛假//假
[]? 'hello':'goodbye'//'hello'
[] == true? 'hello':'goodbye'//'goodbye'
我可以想出更多,但基本上如何到達這些結果?
的JavaScript做了很多類型的鑄件,其並不明顯不知道它(JavaScript equality transitivity is weird) 。
的!
NOT運算符,Boolean
功能,? :
三元運算符,if
-clauses和邏輯AND/OR操作確實使用了內部ToBoolean
conversion - 這是什麼是我們生產的falsy價值0
的理解,NaN
,""
,null
,undefined
和false
。
但是,當您比較事物時,(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
保持...魔術 *波手中神祕*
在一個更嚴重的是,第二,!
運營商呼籲toBoolean
上null
,因此,如果您選中!null == !false
或!!null == false
你應該得到true
。其他情況可能發生類似的情況。
隨着由Tore漢森提供的信息,我們可以回答另外兩個爲好。 []是一個'truthy'值,但不是布爾值,所以直接將它與真實的返回值false
進行比較。但是,您可以使用!運營商再次使其成爲布爾,所以!![] == true
返回true
!
與其他情況下,一個空數組是不是未定義或null,所以它返回true,但它不是一個布爾==真,所以這就是爲什麼它說再見 –
@ToreHanssen啊,所以它是類似的東西:)謝謝你讓我知道! – Jordan
有一個有趣的帖子在這個題目在這裏:http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
在您的一些例子,來強制脅迫,只是用「==」是不夠的。
!!空==假
!! []
!! [] ==真
的可能重複的[JavaScript的類型轉換(http://stackoverflow.com/questions/4626361/javascript-type-casting) – Bergi