在Javascript中:的Javascript:空白字符串布爾轉換
!!" " == true // => true
" " == true // => false
if (" " == true){a = 1;} else {a = 0;}
a; // => 0
if (" "){b = 1;} else {b = 0;}
b; // => 1
關於這裏發生的事情你知道嗎?
在Javascript中:的Javascript:空白字符串布爾轉換
!!" " == true // => true
" " == true // => false
if (" " == true){a = 1;} else {a = 0;}
a; // => 0
if (" "){b = 1;} else {b = 0;}
b; // => 1
關於這裏發生的事情你知道嗎?
通過你的例子讓我們一步:
!!" " == 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。
Oooh ok:「根據Mozilla文檔,如果操作數是數字或布爾值,則兩個操作數都轉換爲數字。」這解釋了一切。謝謝 ! – glmxndr 2010-11-18 16:34:25
Jonathon - 只是一個友好的筆記,供將來參考。如果您要從另一個答案(如果確實來自我的)或從其他來源借用信息,最好在您的答案中提供確認。 ; o) – user113716 2010-11-18 16:45:07
@patrick dw - 道歉,我盡力認真對待。我一直在瀏覽Mozilla文檔,你的回答確實讓我想起了我需要仔細閱讀的部分。 – 2010-11-18 17:10:49
長度的字符串等於true的值。 對布爾值的字符串評估是錯誤的,因爲它們不是相同的數據類型。
雙!!
是一個非錯誤的操作用法。
所以你說:
「」 ==假 - >假==假 - >真== TRUE
擊穿:
(!(!" ") == true)
(!(false) == true)
(true == true)
(true)
從部分9.3.1中的ECMAScript 5,關於將字符串轉換爲數字:
甲StringNumericLiteral是空的或僅包含空白被轉換爲0。
如果兩個操作數是相同類型的不是,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
Woops,調整了我的答案。如果字符串比較布爾錯誤。 – 2010-11-18 16:02:42
你是詢問falsey值? – annakata 2010-11-18 15:21:24