2012-11-25 66 views
2

JavaScript有不同的平等comparison operators什麼時候是(true == x)=== !! x false?

  • 平等==
  • 嚴格等於===

它也有一個logical NOT!和我傾向於認爲使用雙邏輯NOT,!!x的,如基本上與true == x一樣。

但是我知道這並非總是如此,例如, x = [],因爲[]truthy對於!,但是對於==有錯誤

那麼,其中x s會(true == x) === !!x給出假?或者,什麼是falsy==但不是!!(反之亦然)?

+1

鬆散的平等與真實無關。 – SLaks

+1

多數民衆贊成深深!!!!! –

+1

'「a」== true'爲false –

回答

8

「所以,這x s就(true == x) === !!xfalse?」

不限x其中其布爾轉換是不一樣的它的轉換由Abstract Equality Comparison Algorithm


一個例子是僅具有空白的字符串:

var x = " "; 

其布爾轉換是true(如與任何非空字符串的情況下),但其==比較false因爲只有空格的字符串將被轉換爲數字0,並且true值將被轉換爲數字1,並且這些值不相等。

x == true; // false 
!!x;  // true 

或以示出最終值==在比較:

Number(true) == Number(x); 
//  1 ==  0 

1 == 0; // false 

,並顯示出的!!x的結果,這將是等效於這樣的:

Boolean(x); // true 

所以你的原始表達式可以粗製濫造被視爲如下:

var x = " "; 

    (Number(true) == Number(x)) === Boolean(x); 
// (  1 ==  0) ===  true 
//     (false) ===  true 

    false === true; // false 

我說「粗暴」,因爲這肯定不捕獲上面鏈接的算法的所有細節,並榮獲」 t對於提供給操作數的所有值都是相同的。

要了解==如何處理它的操作數,你真的需要研究一下這個算法。

+0

謝謝,我基本上在尋找[ToBoolean](http://es5.github.com/#x9.2)與[Abstract Equal Comparison Comparison Algorithm](http://es5.github.com/ #x11.9.3),現在我可以閱讀它們是如何定義的。 –

+1

@PaulS .:不客氣,不幸的是,沒有簡單的規則。歸根結底是理解算法,並且通常通過限制對'=='的使用來簡化你的生活。我不想完全排除它,因爲至少有一種情況下規則很簡單並且提供了更簡潔的代碼。 –

+0

只是幾個更具體的案例是: (true == [])=== !! []/* false */ (true == {})=== !! {}/* false */ –

-1

鬆散的平等與真實無關。

鬆散平等的規則基本上涉及比較每個對象的.valueOf()函數的結果。
欲瞭解更多詳情,請參閱spec

相關問題