2013-05-26 40 views
1

我正在通過將「truthy」布爾值傳遞給函數來在腳本中設置模式。在函數中,簡單的if語句檢查參數是否爲truefalse。我有時把它作爲一個字符串或一貫致力於一個布爾值,但由於某些原因,它是不是這樣的:JavaScript IF語句boolean strict

setMode: function(Setting) {  
    if (Setting) { 
     console.log('Enabling mode'); 
    } else { 
     console.log('Disabling mode'); 
    } 
} 

例如,當我將它傳遞一個字符串'false'和日誌Setting安慰,控制檯說false,但if聲明認爲這是真的。

我必須把它添加到函數的開始,它的工作:

如果(typeof運算設置==「串」){ 設置=(設置==「真」); }

在使用它的一個例子:

var inverted = $('INPUT[name="Mode"]').prop('checked'); 
app.setMode(inverted); 

和另:

var mode = localStorage.getItem('Mode'); 
this.setMode(mode); 

它是如此奇怪的,因爲我已經做這種類型的事情了多年但它現在纔開始。也許因爲我正在使用localStorage.prop

+2

'localStorage'只能存儲字符串。我建議訪問LS始終用JSON.parse/stringify對包裝。 –

+0

重要嗎?如果它是一個字符串或一個布爾值,一個'if'語句仍然會將其視爲'true'或'false',但它不是這種情況。 – Jared

+0

此外,我也嘗試使用複選框,結果相同。 – Jared

回答

2

如果您嘗試登錄'false'顯而易見的是,控制檯日誌false(它是一個字符串),而如果語句看到true,因爲沒有空的字符串是一個真正的布爾值。

如果你想檢查字符串是否爲"true""false"你必須做到這一點與普通的操作符。所以,你可以在你的函數的開頭添加這行:當我通過一個字符串'false'並將其記錄到控制檯

Setting = (typeof Setting === 'string') ? Setting === "true" : Setting; 
+2

這不適用於字符串'false'。 '!!'false'=== true' – JAM

+0

查看我的更新答案,空字符串爲false,對於JS不是空的。 –

+1

除了添加無用的雜亂之外,「if(!! Setting)」與「if(Setting)」有什麼不同? – interjay

1

例如,控制檯說:false,但if語句認爲它是真實的。

控制檯輸出是混亂的,這是隱藏在報價和記錄false既爲字符串"false"和布爾false。然而,這兩個不是等價的,字符串不是空的,而且真的是真的。

也許是因爲我使用localStorage和.prop?

是的。 .checked屬性返回一個布爾值,並且一切正常。相反,local storage only stores strings,並且當你傳入一個布爾值時,你會返回它的字符串。您可以撤消通過使用

var modeStr = localStorage.getItem('Mode'); 
var mode = JSON.parse(modeStr); 
this.setMode(mode); 
2

要獲得關於字符串布爾轉換問題:

ECMA規格:

[這個轉換]結果是假的,如果參數是空字符串(其長度爲零); 否則結果是真實的。

所以,是的,如果你把這個字符串「假」將轉換爲true,這意味着你唯一的選擇就是手動檢查字符串「真」或「假」,並做轉換你自己。

但是,jQuery函數.prop("checked")應該返回一個布爾值(或undefined如果屬性未定義)。所以我會說你應該可以做到

if (elem.prop("checked")) 

like here