2015-12-20 50 views
1

的時候如果我寫了下面的代碼:的JavaScript似乎來評價一個無效的結果比較兩個值

" \t\r\n" == 0 

的JavaScript將返回true。但是,如果我手動轉換這兩個值布爾值,則:

!!" \t\r\n" // returns true 
!!0 // returns false 

這是平均的JavaScript說true == false在第一個表達式,但如果我比較值相反的轉換爲布爾值,它沒有任何意義我。

請注意,我不寫!!"0",而是!!0而不是 - 差別很大。

+0

http://stackoverflow.com/questions/359494/does-it-matter-which-equals-operator-vs-i-use-in-javascript-comparisons – BassT

+0

這不能回答我的問題。我不在這裏使用===運算符 – KBS

+0

@BassT如果我使用==,則這兩個值都會轉換爲布爾值,如上所示,這不起作用 – KBS

回答

1

比較

" \t\r\n" == 0 

是真實的。

讓與算法Abstract Equality Comparisonx == y)開始

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

看看它說,如果第一個是一個字符串,它是和第二個是一個數字,它是轉換的第一個基於該ToNumber()操作的數量。

那麼什麼是ToNumber()操作,here it is in the spec

ToNumber應用到字符串應用以下語法輸入字符串 。
如果語法無法將字符串解釋爲 StringNumericLiteral的擴展,則ToNumber的結果是NaN。

對字符串如何不同的轉換與ToNumber整章是相當複雜的,但還有更遠的規範是說

StringNumericLiteral ::: [empty]MV0
MV

(MV =數學值)

所以這是空的,或者只是包含空白任意字符串,轉換成0

讓剛剛嘗試,並強迫該字符串自己

console.log(+" \t\r\n"); // gives the number 0 

所以含有空格,製表符和換行符的字符串轉換爲0

因此,將字符串" \t\r\n"與內部ToNumber()操作使瀏覽器0,所以自然0 == 0true,這就是答案。

0

首先,您使用的是平等而非嚴格的平等來比較兩個值。

當使用==(相等)值將被強制。這在使用===(嚴格平等)時不會發生。

" \t\r\n" == 0 // returns true, these values are 'falsy', which are coerced to false 

" \t\r\n" === 0 // returns false 

this question以供參考。因爲該語言的規範說,它應該是真實的