2016-07-29 69 views
12

我就喜歡四處知道爲什麼在標題[] ==![]的值爲true

[] == ![]

給定的表達式評估爲真。

您不能將數組作爲字符串進行比較。我明白了。如果

[] == []

將評估爲假,因爲引用是不同的。雖然如果我們有以下陳述。

var arr = []; 
arr == arr // this evaluates to true simply because references are the same. 

爲了使A == B返回true,A或B必須是false或true。 A ==!B爲了返回true,A可以是true,B可以是false,反之亦然,但在這種情況下,A和B是相同的值,所以我不明白。

+6

這個問題沒有錯。它不配得到降價。如果你不同意,你應該留下評論和解釋。 – Brad

+0

也許蒂姆又放下鑰匙了? – Li357

+0

我不知道爲什麼會有人低估這一點。這不是很明顯。對布拉德的陳述+1 +1 – Tek

回答

4

![]的計算結果爲false,因爲參考文獻是truthy。 []可以轉換爲一個數字(在這種情況下爲0),這是錯誤的。因此:條件平等。如果你做了===這將是錯誤的。

+2

'[]'並不虛假。 '[]'是一個對象。在你的瀏覽器中試一試:'if([])console.log('not falsey')' –

+1

這個答案是不正確的。 – Brad

+2

我很確定[它會轉換成數字,而不是字符串](http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3)。 – Quentin

-1

數組是javascript中的一個特殊對象,可以與自定義對象進行比較。 即使它的類型是objects,[] instanceof Array == true;

因此使用var x = [];與調用Array構造器完全相同。在javascript中比較兩個對象的實例將返回false,因爲它們不共享相同的內存地址。這就像一個指針比較。

+0

問題不在於比較兩個數組。這是關於將數組與布爾值進行比較的。 – Quentin

+0

uups ..我的錯 – Wolfgang

6

基本上,如果兩個類型都不相同,Javascript會嘗試將兩邊都轉換爲數字。而如果一個對象,它試圖轉換爲原始值

因此,在這種情況下,一步一步地將

=> []==![] 

=> []==false // Type conversion by the statement itself 

=> []==0 // To number of right operand 

=> ""==0 // To Primitive call for Array which will in this case convert to empty string 

=> 0==0 // To number call of "" which is 0 

=> true 

人們可以在編譯器中的描述在這裏檢查ECMAScript的解釋http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

1

這裏有更詳細的解釋從codementor.io

在瞭解發生了什麼之前,我們需要了解JavaScript中的真理和謬誤的概念以及如何! (邏輯NOT)運算符工作。如false, null, undefined, NaN, 0, '' and ""等值被視爲虛假。 其他值如*true, {}, [], "foo" *等被認爲是真的。 The!另一方面,運算符僅用於布爾值。 使用!時,任何其他數據類型將自動被強制轉換爲相應的布爾值。運營商。 這裏,![]的計算結果爲false,比較結果實際上變爲'[] == false',計算結果爲'true'。 這不應該是假的,因爲空陣列是真的嗎? 這是對的,但雙等號運算符評估某些規則上的表達式。 我們試圖將一個對象與一個布爾值進行比較,JavaScript會隱式地將這些操作數轉換爲數字類型。Number([]) is 0Number(false) is also 0,其評估爲true since zero is equal to zero

1

每當使用==比較2個值時,javascript執行抽象等式比較算法。

enter image description here

這裏,x是[],y是![]。 此外,

typeof([]) // "object" 
typeof(![]) // "boolean" 

因爲y是一個布爾值和x是一個對象,條件7是第一保持:

如果Type(y)爲布爾型,返回的比較x的結果== ToNumber(y)。

ToNumber(y)的值是什麼?

Number(![]) // 0 

因爲[]是一個真值,否定使它成爲假。數(假)是0

現在我們有比較:[] == 0

由於typeof運算(0)是 「數字」,條件8現在持有:

如果Type( x)是Object和Type(y)是String或Number,返回 ToPrimitive(x)== y的比較結果。

ToPrimitve(x)就像x.toString()。

[].toString() // 」」 - the empty string 

差不多完成了,我們現在用的比較臉:「」 == 0

現在,條件5成立:

如果Type(x)的字符串和類型(y)爲數字,返回 比較ToNumber(x)== y的結果。

ToNumber(「」) // 0 

最後兩個操作數具有相同的類型和條件1成立。我認爲你可以採取,如果從這裏:)

閱讀關於Abstract Equality Comparison在規格!

相關問題