2010-11-18 45 views
2

在Javascript中:的Javascript:空白字符串布爾轉換

!!" " == true // => true 
" " == true // => false 

if (" " == true){a = 1;} else {a = 0;} 
a; // => 0 

if (" "){b = 1;} else {b = 0;} 
b; // => 1 

關於這裏發生的事情你知道嗎?

+0

你是詢問falsey值? – annakata 2010-11-18 15:21:24

回答

3

通過你的例子讓我們一步:

!!" " == true // => true 

您已經通過否定它將字符串「」轉換爲布爾值。長度不爲零的字符串在轉換爲布爾值時將計算爲true,因此兩次取反會導致布爾值爲true。顯然是true == true。此示例不會導致將第二個參數轉換爲字符串,因爲一元運算符!的優先級高於==運算符,因此在計算==運算符時,兩個操作數都是相同類型(布爾值)。

" " == true // => false 

每Mozilla的文檔(在patrick dw's answer所示相關的部分),如果操作數是一個數字或一個布爾兩個操作數被轉換爲數字。你以0 == 1結尾,這是錯誤的。

在這種情況下,我相信 第二個參數被強制轉換爲一個字符串。你基本上在做 " " == "true",這是錯誤的。這是字符串的比較,而不是字符串和布爾值的比較。

if (" " == true){a = 1;} else {a = 0;} 

這是一樣的前一個:一個操作數是布爾值,因此這兩個值被轉換爲數字。

if (" "){b = 1;} else {b = 0;} 

這與第一個相同。該字符串被強制爲一個布爾值。該字符串具有非零長度,因此它返回true。

+0

Oooh ok:「根據Mozilla文檔,如果操作數是數字或布爾值,則兩個操作數都轉換爲數字。」這解釋了一切。謝謝 ! – glmxndr 2010-11-18 16:34:25

+0

Jonathon - 只是一個友好的筆記,供將來參考。如果您要從另一個答案(如果確實來自我的)或從其他來源借用信息,最好在您的答案中提供確認。 ; o) – user113716 2010-11-18 16:45:07

+0

@patrick dw - 道歉,我盡力認真對待。我一直在瀏覽Mozilla文檔,你的回答確實讓我想起了我需要仔細閱讀的部分。 – 2010-11-18 17:10:49

0

長度的字符串等於true的值。 對布爾值的字符串評估是錯誤的,因爲它們不是相同的數據類型。

!!是一個非錯誤的操作用法。

所以你說:

「」 ==假 - >假==假 - >真== TRUE

擊穿:

(!(!" ") == true) 
(!(false) == true) 
(true == true) 
(true) 
2

從部分9.3.1中的ECMAScript 5,關於將字符串轉換爲數字:

甲StringNumericLiteral是空的或僅包含空白被轉換爲0。

而且from MDC docs

如果兩個操作數是相同類型的不是,JavaScript的轉換操作數則實行嚴格的比較。如果任一操作數是數字或布爾值,則操作數儘可能轉換爲數字;否則,如果其中一個操作數是一個字符串,則另一個操作數將盡可能轉換爲字符串。

因此,由於字符串正在與布爾值進行比較,因此嘗試將其轉換爲數字。由於空白字符串或只有空格的字符串被轉換爲0,因此它將被視爲錯誤。

" " == false; // true 
" " == 0;  // true 
"false" == false; // false because "false" can't be converted to a number 

所以,當你這樣做:

!!" " 

您不再依靠==爲你做轉換。而是使用自己的標準手動轉換它,即不將其轉換爲數字,而是在==發生前將其轉換爲布爾值。

所以你在做true == true或可能實際上1 == 1

要看到只有空白的字符串轉換成數字,使用一元+操作是這樣的:

alert(+" "); // alerts 0 
+0

Woops,調整了我的答案。如果字符串比較布爾錯誤。 – 2010-11-18 16:02:42