2012-04-29 2 views
3

При построении плагина jQuery, который должен быть передан логическим значением, самый fool-proof способ преобразования ввода в логическое значение по-дружески?Какой самый надежный способ передать логическое значение в плагин jQuery?

Чтобы быть более точным: я боюсь случая, чтобы люди могли бы передать строку из 'false' (вместо простого false) и, следовательно, простое преобразование !!option или Boolean(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

«Обычная ошибка, которую люди делают при попытке создать что-то совершенно безупречное, - это недооценить изобретательность полных дураков». -Douglas Adams – j08691

+0

@ j08691 Хорошо, что я сам дурак, поэтому готовлюсь к множеству изобретательности: P Кроме этого замените «дураки» на «удобные для пользователя» – m90

+4

Не пытайтесь «исправить», такие вещи. Проектирование API для обуздания некомпетентных программистов - это, как правило, ужасная идея. – Pointy

ответ

4

Самый дурак доказательство путь, если вы боитесь такого входа, чтобы сделать только

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

Посмотрите на решение у вас есть сейчас, вы не приняли во внимание 0 или 1 , Или как насчет no или yes?

Строки и целые числа не предназначены для использования в качестве булевых; поэтому нет необходимости разбирать их.


Посмотрите на высокое качество/использования механизмов JS, они не делают этого.Зачем вам это нужно?

+0

Ну, в случае, если docs заявляют, что «передают логическое значение», и кто-то передаст имя своих собак, я мог бы жить с ошибками, поэтому я просто искал способ обойти «ложные» проблемы - кроме этого вы совершенно правы. – m90

+0

@ m90: Как вы определили, что это проблема? –

+0

@TomWijsman 'false' не считается ложным, в то время как' true' является правдивым, и распространенной ошибкой является включение параметров с кавычками. – Christoph

4

Я сделал бы это.

var result = (userInput === 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

Это будет обнаружить их, независимо от того, что они (технику, аналогичную в верхнем регистре как слова поиска, так и слова сравнения)

Поскольку список короткий, вы также можете сделать это с помощью коробок-переключателей или иначе ifs

+4

Кормление программистов, которые совершают ошибки, - очень плохая идея. A 'O (n)' для поиска цикла и массива, * действительно? * –

+0

@TomWijsman true, может быть, случаи смены переключателей, иначе ifs будет быстрее – ajax333221

+1

@ ajax333221 или .. вы можете просто использовать хэш-таблицу, которая имеет среднее значение O (1 + n/k) –

Смежные вопросы