2016-12-24 46 views
3

有人可以向我解釋爲什麼這不起作用嗎?值是真的,它是布爾值,如果我像通常那樣檢查它,如果(值){};有用。爲什麼不喜歡這個?如果(值===真)不起作用

function updateRecords(value) { 

    console.log(!!(value));  // true 
    console.log(typeof(!!(value))); //boolean 

    if (value === true) { 
     alert("success"); 
     } 
} 

    updateRecords("Take a Chance on Me"); 
+2

這不是一個布爾值。由於類型轉換,您針對​​運行'typeof'的「東西」是一個布爾值。爲了證明它,嘗試記錄「typeof(value)」 – wally

回答

6

您使用的值是一個字符串,而不是布爾值。當你寫這樣的:

console.log(!!(value)); 

你是值轉換爲布爾值,但是你沒有捕捉它。你轉換它並記錄下來,然後它就被扔掉了。那麼你的下一行:

console.log(typeof(value)); // string NOT Boolean 

回到測試value(串)的原始值。

三重等號檢查「類型和值相等」,因此您的if測試失敗。

現在,如果您刪除其中一個等號(==)並測試簡單的「值類型轉換」值,它仍然不會工作,除非您正在測試的文本轉換爲與true相同的數字(請參閱下面的鏈接瞭解詳情),但這不會發生,您的字符串將轉換爲NaN(不是數字)並且true將轉換爲1,因此即使value == true也會失敗

您可以看到更多關於平等和類型轉換如何協同工作的詳細信息。here

無論如何,在這種情況下,不測試對布爾true,只是測試數據的存在:if(value)不嘗試將值轉換爲number,它試圖將其轉換爲布爾。只要你沒有一個空字符串或僅有空白字符的字符串,它會轉換成true

function updateRecords(value) { 
 

 
    console.log(!!value);  // true 
 
    console.log(typeof value); // string 
 

 
    // Don't test against true (that's implied), just test the data. 
 
    if (value) { 
 
     alert("success"); 
 
    } 
 
} 
 

 
updateRecords("Take a Chance on Me");

或者,捕捉你的數據的鑄造版本,然後您可以使用===

function updateRecords(value) { 
 
    // Convert the value of "value" to a Boolean and 
 
    // store that value back in the original variable 
 
    value = !!value; 
 

 
    // Now, let's test value AFTER capturing its converted value 
 
    console.log(value);   // true 
 
    console.log(typeof value); // boolean 
 

 
    if (value === true) { 
 
     alert("success"); 
 
     } 
 
} 
 

 
updateRecords("Take a Chance on Me");

+0

你忘了'==='! –

+1

明白了! ;) 哈哈! –

+0

我想過把它與double equals比較,它仍然沒有工作。你能解釋爲什麼嗎?我的印象是,自從!!(「Take a Chance on me」)是真實的,並且這個字符串是真的,如果我將它與布爾值進行比較,它就會出現。 –

1

因爲您還沒有在第二種情況下進行類型轉換。

if (!!(value) === true) { 
    alert("success"); 
} 

以前你檢查:

"Take a Chance on Me" === true  // This obviously returns false. 

以上應該工作。否則你不應該使用===運營商。您應該使用==

if (value == true) { 
    alert("success"); 
} 
0

JS可奇怪的(@praveenkumar別名flashgordon:並不總是顯而易見的):

"" == false is true 
"1" == false is false (ok so far) 
"0" == false is true (looks weird) 
" " == false is true (wtf...) 
"\n" == false is true (wtf²) 
+0

這是很好的信息,但對這個問題的答案不是很好。 –