2012-04-29 71 views
3

當建立一個應該傳遞一個布爾值,一個jQuery插件,什麼是一個用戶友好的方式輸入轉換爲布爾最防呆方式?將布爾值傳遞給jQuery插件的最簡單方法是什麼?

更準確地說:我怕的情況下,人們可能通過的'false'(而不是一個普通的false)的字符串並因此!!optionBoolean(option)一個簡單的轉換將返回「錯誤」值(!!'false'true )。

目前我檢查我的var option這樣的:

if (typeof(option) != 'boolean'){ 
    if (option === 'false'){ 
     option = false; //fake false 
    } else { 
     option = !!option; //everything else is converted as truthy/falsy in a standard manner 
    } 
} 

,但我不知道是否有一個更優雅和簡潔的方式這樣做,或者這僅僅是JavaScript的處理這個問題的方法?

+1

「人們在設計完全萬無一失的設計時常犯的一個錯誤是低估了傻瓜的獨創性。」 - 道格拉斯·亞當斯 – j08691

+0

@ j08691好處是我是一個傻瓜自己,所以準備了很多聰明才智:P除此之外,用「用戶友好」取代「傻瓜式」 – m90

+4

不要試圖「修復」這樣的事情。設計一個API來編纂無能的程序員通常是一個可怕的想法。 – Pointy

回答

4

最傻瓜證明的方式,如果你怕這樣的投入,是做只是

if (typeof(option) != 'boolean') 
    console.error('Function X expects a Boolean.'); 

看看你現在有解決方案,你沒考慮到01 。或者noyes

字符串和整數不能用作布爾值;所以,沒有必要解析它們。


看看高品質/使用JS框架,他們不這樣做。你爲什麼要這樣做?

+0

那麼,如果文檔狀態爲「通過布爾值」並且有人會通過他的狗的名字,我可以忍受錯誤的事情,所以實際上我只是想找一種方法來環繞「虛假」問題 - 除此之外你是完全正確的。 – m90

+0

@ m90:你是如何確定這是一個問題? –

+0

@TomWijsman'false'不被認爲是虛假的,而'true'是真實的,並且用引號括起參數是一個常見的錯誤。 – Christoph

4

我會這樣做。

var result = (userInput === true); 

該結果將返回true的唯一方法是如果類型爲布爾值且值爲true。否則一切都是錯誤的。 不要浪費你的時間來解決別人的錯誤。

但是......如果你手上有很多時間,那就試試這個。

var getBooleanValue = function(userInput){ 
    if(!userInput){ 
     return false; 
    } 
    var boolNames = { 
     'true':1, 'yes':1, 
     'false':0,'no':0, 
     'yourMoM':1 
    }; 
    return (userInput in boolNames && !!boolNames[ userInput ])|| (userInput === true); 
}; 
var tests = [ 
    [ true, true ], 
    [ 'true', true ], 
    [ 'yes', true ], 

    [ false, false ], 
    [ 'false', false ], 
    [ 'no', false ] 
]; 
var runTest = function(tests){ 
    var i = tests.length; 
    while(i--){ 
     if(getBooleanValue(tests[i][0]) !== tests[i][1]){ 
      throw new Error("Test error: getBooleanValues(" + tests[i][0] + ") should return " + tests[i][1]); 
     } 
    } 
}; 
runTest(tests); 
+0

+1進行正確的測試。 -1表示後減量,在每次迭代時創建一個臨時值。單線+1。 –

+0

已修復並已更新。 –

+0

'var boolNames = { 'true':1,'yes':1, 'false':0,'no':0, 'yourMoM':this.yes };'無效。你不能在對象字面上使用'this'。否則,很好的解決方案 –

3

我會做這樣的事情:

var falsey = ["0", "", "false", "null", "undefined", "NaN"]; 
var isFalse = false; 

for(var i = 0, len = falsey.length; i < len; i++){ 
    if(options + "" == falsey[i]){ 
     isFalse = true; 
     break; 
    } 
} 

我所做的就是stringize兩個options和falsey值0, "", false, null, undefined, NaN

這將檢測他們不管它們是什麼(類似技術大寫的搜索詞和比較詞)

因爲列表很短,所以也可以用switch case或其他ifs

+4

餵養犯錯誤的程序員是一個非常糟糕的主意。一個用於循環和數組查詢的'O(n)',*真的嗎?* –

+0

@TomWijsman真,也許切換情況下,否則ifs會更快 – ajax333221

+1

@ ajax333221或..你可以使用一個平均值爲O (1 + n/k) –

相關問題