Как преобразовать строку в boolean в JavaScript?



Answers

Предупреждение

Этот высокозатратный исторический ответ технически корректен, но охватывает только очень специфический сценарий, когда ваше строковое значение является ТОЧНО "true" или "false" (ДОЛЖНО также быть строчным).

Неверная строка json, переданная в эти функции ниже, выдает исключение .

Оригинальный ответ:

Как насчет?

JSON.parse("true");

или с помощью jQuery

$.parseJSON("true");
Question

Можно ли преобразовать строку, представляющую логическое значение (например, «true», «false») в собственный тип в JavaScript?

У меня есть скрытая форма в HTML, которая обновляется на основе выбора пользователя в списке. Эта форма содержит некоторые поля, которые представляют собой логические значения и динамически заполняются внутренним булевым значением. Однако, как только это значение помещается в скрытое поле ввода, оно становится строкой.

Единственный способ найти логическое значение поля, как только он был преобразован в строку, должен был зависеть от литерального значения его строкового представления.

var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';

Есть ли лучший способ сделать это?




Я думал, что ответ @Steven был лучшим, и позаботился о гораздо большем количестве случаев, чем если входящее значение было просто строкой. Я хотел немного расширить его и предложить следующее:

function isTrue(value){
    if (typeof(value) === 'string'){
        value = value.trim().toLowerCase();
    }
    switch(value){
        case true:
        case "true":
        case 1:
        case "1":
        case "on":
        case "yes":
            return true;
        default: 
            return false;
    }
}

Нет необходимости покрывать все false случаи, если вы уже знаете все true случаи, которые вам придется учитывать. Вы можете передать что-либо в этот метод, который мог бы передать true значение (или добавить других, это довольно просто), а все остальное будет считаться false




Руки вниз самым простым способом (предполагая, что строка будет «true» или «false»):

var z = 'true';
var y = 'false';
var b = (z === 'true'); // will evaluate to true
var c = (y === 'true'); // will evaluate to false

Всегда используйте оператор === вместо оператора == для этих типов преобразований!




Boolean.parse = function (str) {
  switch (str.toLowerCase ()) {
    case "true":
      return true;
    case "false":
      return false;
    default:
      throw new Error ("Boolean.parse: Cannot convert string to boolean.");
  }
};



Чтобы преобразовать обе строки («true», «false») и boolean в boolean

('' + flag) === "true"

Где flag может быть

 var flag = true
 var flag = "true"
 var flag = false
 var flag = "false"



Объект Boolean не имеет метода «parse». Boolean('false') возвращает true, так что это не сработает. !!'false' также возвращает true , так что это тоже не сработает.

Если вы хотите, чтобы строка 'true' возвращала логическое значение true и строку 'false' чтобы возвращать логическое значение false , самым простым решением является использование eval() . eval('true') возвращает true, а eval('false') возвращает false. Помните о влиянии производительности при использовании eval() .




Я написал функцию для соответствия PHP filter_var, которая делает это красиво. Доступно в формате: https://gist.github.com/CMCDragonkai/7389368

/**
 * Parses mixed type values into booleans. This is the same function as filter_var in PHP using boolean validation
 * @param  {Mixed}        value 
 * @param  {Boolean}      nullOnFailure = false
 * @return {Boolean|Null}
 */
var parseBooleanStyle = function(value, nullOnFailure = false){
    switch(value){
        case true:
        case 'true':
        case 1:
        case '1':
        case 'on':
        case 'yes':
            value = true;
            break;
        case false:
        case 'false':
        case 0:
        case '0':
        case 'off':
        case 'no':
            value = false;
            break;
        default:
            if(nullOnFailure){
                value = null;
            }else{
                value = false;
            }
            break;
    }
    return value;
};



другое решение. jsFiddle

var toBoolean = function(value) {
    var strValue = String(value).toLowerCase();
    strValue = ((!isNaN(strValue) && strValue !== '0') &&
        strValue !== '' &&
        strValue !== 'null' &&
        strValue !== 'undefined') ? '1' : strValue;
    return strValue === 'true' || strValue === '1' ? true : false
};

тестовые примеры выполняются в узле

> toBoolean(true)
true
> toBoolean(false)
false
> toBoolean(undefined)
false
> toBoolean(null)
false
> toBoolean('true')
true
> toBoolean('True')
true
> toBoolean('False')
false
> toBoolean('false')
false
> toBoolean('0')
false
> toBoolean('1')
true
> toBoolean('100')
true
> 



Ваше решение в порядке.

Использование === было бы просто глупо в этом случае, так как значение поля всегда будет String .




Я немного опаздываю, но у меня есть небольшой фрагмент, чтобы сделать это, он по существу поддерживает все JTripts truthey / falsey / filthy -ness, но включает "false" в качестве допустимого значения для false.

Я предпочитаю этот метод тем, о которых упоминалось, потому что он не полагается на стороннюю сторону для разбора кода (т. Е. Eval / JSON.parse), который, по моему мнению, является излишним, он достаточно короткий, чтобы не требовать функции полезности и поддерживает другие правила truthey / falsey.

var value = "false";
var result = (value == "false") != Boolean(value);

// value = "true"  => result = true
// value = "false" => result = false
// value = true    => result = true
// value = false   => result = false
// value = null    => result = false
// value = []      => result = true
// etc..



Существует так много ответов. Но следующие могут быть полезны в некоторых сценариях.

// One can specify all values against which you consider truthy
var TRUTHY_VALUES = [true, 'true', 1];

function getBoolean(a) {
    return TRUTHY_VALUES.some(function(t) {
        return t === a;
    });
}

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

getBoolean('aa'); // false
getBoolean(false); //false
getBoolean('false'); //false

getBoolean('true'); // true
getBoolean(true); // true
getBoolean(1); // true



Это было принято из принятого ответа, но на самом деле у него очень слабый момент, и я шокирован тем, как он получил это количество upvotes, проблема с ним, что вы должны рассмотреть случай строки, потому что это чувствительно к регистру

var isTrueSet = (myValue.toLowerCase() === 'true');



Я обнаружил, что использование «1» и пустого значения «» для логических значений работает гораздо более предсказуемо, чем «истинные» или «ложные» значения строк ... в частности, с формами html, поскольку неинициализированные / пустые значения в элементах Dom будут последовательно оценивать к false, тогда как любое значение внутри них оценивается как true.

Например:

<input type='button' onclick='this.value = tog(this.value);' />

<script type="text/javascript">

    function tog(off) {
        if(off) {
            alert('true, toggle to false');
            return '';
        } else {
            alert('false, toggle to true');
            return '1';
        }
    }   
</script>

Просто казалось, что это более простой путь, до сих пор он был очень последовательным / легким ... возможно, кто-то может определить способ нарушить это?




Не забудьте сопоставить случай:

var isTrueSet = (myValue.toLowerCase() === 'true');

Кроме того, если это флажок элемента формы, вы также можете определить, установлен ли флажок:

var isTrueSet = document.myForm.IS_TRUE.checked;

Предполагая, что если он проверен, он «установлен» равен true. Это оценивается как true / false.




Я думаю, что это очень универсально:

if (String(a) == "true") ...

Это идет:

String(true) == "true"     //returns true
String(false) == "true"    //returns false
String("true") == "true"   //returns true
String("false") == "true"  //returns false



Links