Как я могу преобразовать строку в логическое значение в JavaScript? - PullRequest
2162 голосов
/ 05 ноября 2008

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

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

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

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

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

Ответы [ 74 ]

22 голосов
/ 14 июля 2014
var falsy = /^(?:f(?:alse)?|no?|0+)$/i;
Boolean.parse = function(val) { 
    return !falsy.test(val) && !!val;
};

Возвращает false для каждого ложного значения и true для каждого истинного значения, кроме 'false', 'f', 'no', 'n' и '0' (без учета регистра).

// False
Boolean.parse(false);
Boolean.parse('false');
Boolean.parse('False');
Boolean.parse('FALSE');
Boolean.parse('f');
Boolean.parse('F');
Boolean.parse('no');
Boolean.parse('No');
Boolean.parse('NO');
Boolean.parse('n');
Boolean.parse('N');
Boolean.parse('0');
Boolean.parse('');
Boolean.parse(0);
Boolean.parse(null);
Boolean.parse(undefined);
Boolean.parse(NaN);
Boolean.parse();

//True
Boolean.parse(true);
Boolean.parse('true');
Boolean.parse('True');
Boolean.parse('t');
Boolean.parse('yes');
Boolean.parse('YES');
Boolean.parse('y');
Boolean.parse('1');
Boolean.parse('foo');
Boolean.parse({});
Boolean.parse(1);
Boolean.parse(-1);
Boolean.parse(new Date());
17 голосов
/ 07 декабря 2010

У логического объекта нет метода parse. Boolean('false') возвращает true, поэтому это не сработает. !!'false' также возвращает true, так что это также не будет работать.

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

15 голосов
/ 31 июля 2013

Я использую следующее:

function parseBool(b) {
    return !(/^(false|0)$/i).test(b) && !!b;
}

Эта функция выполняет обычное логическое приведение, за исключением строк «false» (без учета регистра) и «0».

15 голосов
/ 18 февраля 2015

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

Краткое описание результатов (чем выше, тем лучше):

  1. Условное заявление : 2 826 922
  2. Корпус переключателя на объекте Bool : 2 825 469
  3. Кастинг в JSON : 1 867 774
  4. !! преобразования : 805,322
  5. Прототип String : 713 637

Они связаны с соответствующим ответом, где вы можете найти больше информации (плюсы и минусы) о каждом; особенно в комментариях.

13 голосов
/ 22 января 2010
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.");
  }
};
11 голосов
/ 22 января 2013

Вы просто ищете выражение

/^true$/i.test(myValue)

как в

var isTrueSet = /^true$/i.test(myValue);

Это проверяет myValue на соответствие регулярному выражению без учета регистра и не изменяет прототип.

Примеры:

/^true$/i.test("true"); // true
/^true$/i.test("TRUE"); // true
/^true$/i.test("tRuE"); // true
/^true$/i.test(" tRuE"); // false (notice the space at the beginning)
/^true$/i.test("untrue"); // false (some other solutions here will incorrectly return true
/^true$/i.test("false");// returns false
/^true$/i.test("xyz");  // returns false
11 голосов
/ 03 июня 2016

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

// 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
10 голосов
/ 25 ноября 2016

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

var isTrueSet = (myValue.toLowerCase() === 'true');
9 голосов
/ 11 марта 2015

Чтобы преобразовать как строку ("истина", "ложь"), так и логическое значение в логическое значение

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

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

 var flag = true
 var flag = "true"
 var flag = false
 var flag = "false"
9 голосов
/ 14 декабря 2017

почему бы вам не попробовать что-то подобное

Boolean(JSON.parse((yourString.toString()).toLowerCase()));

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

// 0-> false
// any other number -> true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...