2017-09-15 133 views
0

對話很便宜,我會顯示我的代碼。爲什麼(!a)和(a == false)不相等?

var a; // a = undefined 
    if(a == false){ // As I typed == not ===, a needs to be translated to boolean (undefined == false) but it doesn't 
     return false; 
    } 
    else { 
     return true; 
    } 
    // true 

這將返回true,但我相信,這將返回false,因爲不確定的是一樣的錯誤,當我使用雙相等。當我試圖用

if(!a){..} else {..}; 
// false 

事情來到這裏的怪我得到了我的錯誤,但直到這一刻我以爲(!a)和(A == false)被完全平等的。

+2

only'undefined == null'爲'true' not'undefined == false'。 –

+1

@ibrahimmahrir:這與'null'有什麼關係? –

+0

@FelixKling他可能將它們混合起來(當使用'=='時,所有的falsy值都是相等的,但只有'null'和'undefined')。 –

回答

6

簡短的回答:

!a值轉換爲布爾。
a == false的值與布爾值進行比較。

這些是兩種不同的操作。


!a相當於Boolean(a) ? false : trueBoolean(a)返回false如果a

  • undefined
  • null
  • 0
  • ''
  • NaN
  • false

在其他情況下,它返回true

a == false會發生什麼是bit more evolved,但沒有那麼複雜。發生的最重要的事情是false被轉換爲一個數字,所以你實際上比較a == 0。但undefined在比較算法中以特殊方式處理。它不會轉換爲任何其他類型,因此該算法僅返回false

I wrote the following interactive tool爲JavaScript當然它會顯示這是比較兩個值時執行的算法的步驟:

enter image description here


類似的問題:

2

唯一正確的答案是 「這事情是這樣的」。您的困惑的來源是JavaScript的一個特性,稱爲type coercion以及不同類型的相等組合(JavaScript中的==,===)。

有一張有趣的表格,告訴你JavaScript Equality Tabletrue的比較結果。

只有兩個值,這將給true時-compared ==nullnullundefined

換句話說,x == null將是true當且僅當是xnullundefined

1

你有一個錯誤的假設。 x == false不同系xboolean。實際上,==就是它的own equality table

如果你不相信,隨機的相關博客文章,這裏是spec

7.2.12摘要相等比較

比較X == y,其中x和y的值,產生真或 錯誤。這樣的比較如下進行:

  1. ReturnIfAbrupt(x)。
  2. ReturnIfAbrupt(y)。
  3. 如果Type(x)與Type(y)相同,則返回執行嚴格等式比較x === y的結果。
  4. 如果x爲null且y未定義,則返回true。
  5. 如果x未定義且y爲null,則返回true。
  6. 如果Type(x)是Number和Type(y)是String,則返回比較結果x == ToNumber(y)。
  7. 如果Type(x)是String並且Type(y)是Number,則返回比較結果ToNumber(x)== y。
  8. 如果Type(x)是布爾型,則返回比較結果ToNumber(x)== y。
  9. 如果Type(y)是布爾型,則返回比較結果x == ToNumber(y)。
  10. 如果Type(x)是String,Number或Symbol且Type(y)是Object,則返回比較結果x == ToPrimitive(y)。
  11. 如果Type(x)是Object且Type(y)是String,Number或Symbol,則返回比較結果ToPrimitive(x)== y。
  12. 返回false。

所以對於undefined == false:首先我們打#9,然後#12,其計算結果爲假。

1

(!a)和(a == false)是絕對相等的。

您使用兩個不同的運營商,並假定它們是絕對等於 - 從來沒有做到這一點,是有原因的2個不同的運營商存在的,而不是1

現在,想到NaN(作爲一個例子,其他人可以申請)。根據定義NaNfalsy價值,但不false價值,所以:

if(!NaN) {} // this will execute 
if(NaN == false) {} // this will not execute 

你覺得爲什麼出現這種情況?

由於==操作者確實鍵入每類型/值強制,從而NaN不強制地向false,而另一些,如0可以,但兩者都將使用!

求和被認爲falsy並轉換爲true

  • 操作者!使用定義的一組falsy值(false0''""(空字符串),nullundefinedNaN)一切是truthy
  • 操作者==每類型轉換如果原始值被轉換後考慮falsy,所以不關於用途,它可以well truthy
+0

謝謝。 如果我理解正確,(a == true)和(a)也是不同的操作員,是不是? –

+1

你寫他們一樣嗎?問是否「!」與「==」不同的是,如果「==」與「===」不同於「===」就像詢問「1」是否與「2」不同「......在極少數情況下兩個事物是相同的,人們會告訴你,每一個其他的假設只是常識:**你寫它不同**意味着**它是不同的** – Azder

相關問題