Как я могу преобразовать строку в логическое значение в JavaScript?

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

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

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

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

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

5.11.2008 00:13:08
"Есть ли лучший способ сделать это?" - есть, конечно, худший путь: Dstring=(string==String(string?true:false))?(string?true:false):(!string?true:fa‌​lse);
Mark K Cowan 16.04.2015 10:25:28
Легко обрабатывать строки и bools:function parseBool(val) { return val === true || val === "true" }
WickyNilliams 10.09.2015 14:24:24
@Markfunction checkBool(x) { if(x) {return true;} else {return false;} }
Sebi 29.11.2016 15:10:28
@Sebi: Вы забыли задокументировать это:if (checkBool(x) != false) { ... } else { ... }
Mark K Cowan 29.11.2016 18:21:44
!!(parseInt(value) || value === "true")
Andrew Luca 22.02.2017 03:58:58
30 ОТВЕТОВ
РЕШЕНИЕ

Делать:

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

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

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

Не рекомендуется:

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

var myBool = Boolean("false");  // == true

var myBool = !!"false";  // == true

Любая строка, которая не является пустой строкой, будет оценена trueс использованием их. Хотя это самые чистые методы, которые я могу придумать в отношении логического преобразования, я думаю, что это не то, что вы ищете.

3398
25.04.2018 17:32:46
myValue === 'true';точно эквивалентно myValue == 'true';. Там нет никакой выгоды в использовании ===более чем ==здесь.
Tim Down 26.08.2010 11:01:45
Я следую совету и использованию Крокфорда=== и !==всякий раз, когда это имеет смысл, что почти всегда.
guinaps 10.02.2011 15:37:40
Как насчет «ИСТИНЫ» в верхнем регистре, например?
BMiner 10.08.2011 22:45:33
@guinaps Я обычно следую советам Крокфорда, но сценарий « ==против» ===- один из немногих, в которых я не участвую . Я совершенно не согласен с тем, что его «почти всегда» имеет смысл использовать ===. Существуют слабо типизированные языки, потому что мы не хотим заботиться о типе; если мы проверяем что-то вроде этого, if (price >= 50)нам все равно, начинается ли оно как строка. Я говорю, что в большинстве случаев мы хотим , чтобы типы были подтасованы. В тех редких случаях, когда мы не хотим жонглировать типами (например if (price === null)), тогда мы используем ===. Это то, что я делал годами, и у меня никогда не было проблем.
JMTyler 9.05.2013 18:11:45
@JMTyler может упускать из виду программиста по техническому обслуживанию, который придет после. Всегда используйте правильный оператор сравнения! Если вы знаете «наверняка» типы с обеих сторон, но не используете ===, у меня не будет этих знаний при рассмотрении вашего кода позже. Если ваш код используется повторно, это может стать кошмаром. Если вы ДЕЙСТВИТЕЛЬНО хотите, чтобы ваши типы «жонглировали», как вы говорите, тогда используйте «==», но слишком много разработчиков JS с этим справятся слишком легко, лучше уж сжать ваш код. Как часто я хочу, чтобы строка «ложь» означала логическое «истина»?
aikeru 2.07.2013 17:36:06
 var myBool = Boolean.parse("true");

или

var myBool = Boolean("true");

или

var myBool = !!"true";

Не уверен, что первый относится к IE.

-34
5.11.2008 00:15:52
Вот в чем дело с использованием Boolean («true»). Это немного вводит в заблуждение, потому что Boolean («false») и Boolean («wtf») также оценивают как true. Ваш третий ответ очень похож на мой
Kevin 5.11.2008 00:27:56
@FlySwat: я знаю, что это старый ответ, но он все еще отображается в верхних результатах поиска, так что другие пользователи увидят его. Третий пример, который использует !!, также ненадежен. !!"true";вернется, trueно так будет !!"false";и !!"abc";. Когда JavaScript обрабатывает строку с помощью 'true'или 'false'он не различает эти значения. Он просто видит их как строки со значением. Поэтому , используя !оператор на строку : !'anyValue'и даже !' 'будет всегда быть falseи только !'' будет true.
Nope 24.04.2014 15:35:28

Не забудьте сопоставить регистр:

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

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

var isTrueSet = document.myForm.IS_TRUE.checked;

Предполагая, что, если это проверено, это "установлено" равным true. Это оценивается как истина / ложь.

126
5.11.2008 03:04:34
Это вызовет исключение, если это myValueпроизойдет null, trueили какой-то другой тип ...
mik01aj 6.02.2015 10:04:54

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

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

32
5.11.2008 01:12:11
Почему вы думаете, что было бы глупо использовать ===? С точки зрения производительности было бы точно так же, если оба типа являются строками. Во всяком случае, я скорее использую, ===так как я всегда избегаю использования ==и !=. Обоснования: stackoverflow.com/questions/359494/…
Mariano Desanze 17.08.2010 19:01:30
Так как valueвсегда будет stringни ==ни ===глупо. Оба являются правильным инструментом для этой работы. Они отличаются только тогда, когда типы не равны. В этом случае ===просто возвращает falsewhile, ==выполняя сложный алгоритм приведения типа перед сравнением.
Robert 25.06.2013 05:49:06

Вы должны отделить (в своем мышлении) значение вашего выбора и представление этого значения.

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

Другими словами, да, вам нужно зависеть от значения строки. :-)

7
5.11.2008 01:16:37

Если есть какой-то другой код, который преобразует логическое значение в строку, вам нужно точно знать, как этот код хранит значения true / false. Либо это, либо вам нужен доступ к функции, которая обращает это преобразование.

Существует бесконечно много способов представления логических значений в строках («истина», «Y», «1» и т. Д.). Поэтому вам не следует полагаться на какой-либо универсальный преобразователь строки в логическое значение, например, Boolean (myValue). Вам нужно использовать подпрограмму, которая обращает исходное преобразование логическое-строковое, что бы это ни было.

Если вы знаете, что он преобразует истинные логические значения в «истинные» строки, тогда ваш пример кода в порядке. За исключением того, что вы должны использовать === вместо ==, чтобы не было автоматического преобразования типов.

2
5.11.2008 01:17:58

Вы можете использовать регулярные выражения:

/*
 * Converts a string to a bool.
 *
 * This conversion will:
 *
 *  - match 'true', 'on', or '1' as true.
 *  - ignore all white-space padding
 *  - ignore capitalization (case).
 *
 * '  tRue  ','ON', and '1   ' will all evaluate as true.
 *
 */
function strToBool(s)
{
    // will match one and only one of the string 'true','1', or 'on' rerardless
    // of capitalization and regardless off surrounding white-space.
    //
    regex=/^\s*(true|1|on)\s*$/i

    return regex.test(s);
}

Если вам нравится расширять класс String, вы можете сделать:

String.prototype.bool = function() {
    return strToBool(this);
};

alert("true".bool());

Для тех (см. Комментарии), которые хотели бы расширить объект String, чтобы получить это, но беспокоятся о возможности перечисления и беспокоятся о конфликте с другим кодом, который расширяет объект String:

Object.defineProperty(String.prototype, "com_example_bool", {
    get : function() {
        return (/^(true|1)$/i).test(this);
    }
});
alert("true".com_example_bool);

(Конечно, не будет работать в старых браузерах, и Firefox показывает false, тогда как Opera, Chrome, Safari и IE показывают true. Ошибка 720760 )

115
13.04.2018 16:28:39
Вы всегда можете добавить префикс функции, если вы боитесь, что она помешает другому коду. Если какой-то код все еще ломается, этот код слишком хрупок и должен быть исправлен. Если ваша добавленная функция делает объект слишком тяжелым, если это вызывает проблемы с производительностью для другого кода, тогда, очевидно, вы не хотите этого делать. Но я не думаю, что вообще плохая идея расширять встроенные объекты. Они также не были бы общедоступными, если бы это было так.
Shadow2531 16.07.2011 19:06:07
@DTrejo @Szymon Я не согласен. Это именно та вещь, для которой перегружен прототип. Если вы боитесь, что он нарушит (плохой) код, на который опирается for..in, есть способы скрыть свойства от перечисления. См Object.defineProperty.
devios1 12.09.2011 14:29:24
Чтобы следовать соглашению, я бы назвал этоparseBool
guzart 4.02.2012 20:52:01
Булев синтаксический анализ не относится к классу String. В результате вы получите любое количество парсеров и конверсий мусора. -1 к смене прототипов вообще. -1 к решениям, которые не работают кросс-браузер. -1 за плохой дизайн.
Thomas W 14.08.2012 22:40:26
Вот сравнение производительности всех ответов. stackoverflow.com/a/28588344/2824333
sospedra 18.02.2015 16:17:55

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

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

Идет:

String(true) == "true"     //returns true
String(false) == "true"    //returns false
String("true") == "true"   //returns true
String("false") == "true"  //returns false
172
10.02.2016 10:15:19
Когда вы можете получить строку в верхнем регистре или логическое значение, тоString(a).toLowerCase() === 'true'
pauloya 29.02.2012 12:49:27
String("what about input like this that isn't a bool?") == "true"
Thomas Eding 20.09.2013 00:16:52
@ThomasEding false ... что вы хотите, чтобы он вернулся?
Snowburnt 25.10.2013 16:22:52
можно даже сократить, не используя String()конструктор:true+'' === 'true' // true
Todd 15.01.2015 19:12:52
КСТАТИ, для 1 или 0 он также должен бросить на ложь или истину
Miguel 9.03.2018 18:12:53
if (String(a) == "true"){
  //true block
} else {
  //false block
}
2
15.03.2012 14:03:58
stringToBoolean: function(string){
    switch(string.toLowerCase().trim()){
        case "true": case "yes": case "1": return true;
        case "false": case "no": case "0": case null: return false;
        default: return Boolean(string);
    }
}
220
30.08.2015 07:00:25
На самом деле это можно упростить. 1) Нет необходимости проверять "true", "yes"а "1". 2) toLowerCaseне возвращается null. 3) так Boolean(string)же, как string!==""здесь. =>switch(string.toLowerCase()) {case "false": case "no": case "0": case "": return false; default: return true;}
Robert 25.06.2013 05:27:25
@ Роберт, хороший, но я бы предпочел использовать по умолчанию false.
drigoangelo 21.10.2013 19:55:05
@drigoangelo Наличие default: return true;, безусловно, возможно. Но это изменило бы поведение функции.
Robert 24.10.2013 21:18:58
Я подумал, что это лучший ответ, и хотел уточнить его здесь: stackoverflow.com/questions/263965/…
BrDaHa 24.02.2014 00:04:41
если вы нормализуете данные, вызывая .toLowerCase (), то вы, возможно, захотите добавить в trim (), чтобы также удалить пробелы
jCuga 24.02.2014 00:12:56

Просто сделайте:

var myBool = eval (yourString);

Примеры:

alert (eval ("true") == true); // TRUE
alert (eval ("true") == false); // FALSE
alert (eval ("1") == true); // TRUE
alert (eval ("1") == false); // FALSE
alert (eval ("false") == true); // FALSE;
alert (eval ("false") == false); // TRUE
alert (eval ("0") == true); // FALSE
alert (eval ("0") == false); // TRUE
alert (eval ("") == undefined); // TRUE
alert (eval () == undefined); // TRUE

Этот метод обрабатывает пустую строку и неопределенную строку естественным образом, как если бы вы объявили переменную без присвоения ей значения.

-24
22.01.2010 00:22:38
-1: Пожалуйста, не защищайте использование eval (за исключением, возможно, умных хаков и необходимости).
Thomas Eding 22.01.2010 00:32:05
это действительно плохое и небезопасное использование eval. и это даже не умно. -1
moo 22.01.2010 00:35:59
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.");
  }
};
13
22.01.2010 00:30:07
Вы можете использовать true.toString () вместо «true», чтобы быть еще более чистым :-)
tillda 22.02.2011 11:03:47
Не меняйте глобальные переменные, старайтесь держать свои изменения изолированными, возможно, function parseBooleanвместо этого создайте новое
Steel Brain 27.08.2018 17:29:41

Следующего будет достаточно

String.prototype.boolean = function() {
    return "true" == this; 
};

"true".boolean() // returns true "false".boolean() // returns false
1
3.08.2010 06:47:43
Модификация прототипа - очень плохая идея
Szymon Wygnański 7.08.2011 09:18:33
@ SzymonWygnański: я не согласен. Я не вижу никакой другой причины, кроме петли for-in и встроенной поддержки той же функциональности браузерами. Reg for-inloop: я не могу вспомнить случай, когда циклы for-in действительно нужны в строке. Обычная поддержка: мы можем определенно добавить прототип, пока не поддерживаются нативные браузеры, если мы не создаем фреймворк, такой как - прототип или jquery и т. Д. Подробнее об этом @Kangax (Perfection kills) здесь. webcache.googleusercontent.com/…
cypher 18.12.2012 09:19:01
Подумайте: мы можем пойти еще дальше: «true» .checkbox () преобразуется в флажок, или «true» .application () преобразуется в приложение: D Не только циклы for-in терпят неудачу, но стиль здесь неправильный. Где вы будете искать код этого определения «логический / флажок / приложение» в большом приложении? Представьте себе мир, где каждая библиотека будет так думать. Не намного ли лучше определить класс или функцию: флажок («истина») - это просто чище и почти такое же количество букв. Вы никогда не знаете, ЕСЛИ браузеры будут поддерживать вашу пользовательскую функцию, пока она не будет определена как стандарт (например, Object.create и т. Д.).
Szymon Wygnański 3.01.2013 20:40:41

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

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

19
5.02.2016 15:22:19
Чтобы понять, что является «неправильным» (или правильным) в eval, ознакомьтесь со статьями, такими как javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval или выполните поиск по стеку для поиска «Javascript eval malware»
GrahamMc 22.11.2012 08:52:46
Я согласен, что var isTrueSet = (myValue === 'true');это лучший ответ.
thdoan 28.01.2013 07:35:57
Мне нравится, что это сжато. Но это не удается эффектно для основного случая eval('TRUE'); доказывая еще раз, это eval()зло.
Snowman 6.08.2015 09:41:05
@Area 51 «Детективная беллетристика», аналогичным образом, JSON.parse('TRUE')из приведенного ниже ответа также впечатляет. Довольно просто вызвать условие ошибки в JavaScript (или любом другом языке). Чтобы учесть это, вы должны сначала нормализовать строку, например,var myValue = document.myForm.IS_TRUE.value.toLowerCase(); var isTrueSet = (myValue==='true' || myValue==='false') ? eval(myValue) : false;
thdoan 7.08.2015 06:10:32
@ 10basetom: Совершенно верно. Вы должны включить .toLowerCase()в ответ мою точку зрения. Я не пытаюсь ничего форсировать. Прописные буквы TRUE- это достаточно распространенное значение, которое возвращают многие виджеты пользовательского интерфейса.
Snowman 7.08.2015 06:30:37

Руки проще всего (при условии, что ваша строка будет 'true' или 'false'):

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

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

8
22.09.2011 14:46:53
О каком обращении вы говорили? :-)
YMMD 18.05.2012 00:41:44
При сравнении строк в JavaScript нет разницы между использованием операторов == или ===, когда не используются преобразования. Здесь вы сравниваете со строками, поэтому нет преобразования типов. См stackoverflow.com/questions/359494/...
ars265 28.12.2012 15:40:16
function returnBoolean(str){

    str=str.toString().toLowerCase();

    if(str=='true' || str=='1' || str=='yes' || str=='y' || str=='on' || str=='+'){
        return(true);
    }
    else if(str=='false' || str=='0' || str=='no' || str=='n' || str=='off' || str=='-'){
        return(false);
    }else{
        return(undefined);
    }
}
1
27.09.2011 17:47:28

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

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

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


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

Как насчет?

JSON.parse("True".toLowerCase());

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

$.parseJSON("TRUE".toLowerCase());
679
5.11.2019 16:37:01
Проблема в том, что многие потенциальные значения генерируют ошибку разбора, которая останавливает выполнение JS. Итак, запуск JSON.parse («ЛОЖЬ») бомбит Javascript. Суть вопроса, я думаю, состоит не в том, чтобы просто решить эти конкретные случаи, а в том, чтобы быть устойчивым к другим случаям.
BishopZ 26.01.2013 22:52:12
@ Лук, это решение на самом деле именно то, что мне нужно; хорошо, оборачивая это в попытку ... поймать все же. Я хотел преобразовать в bool, только если это было логическое значение в строке; в противном случае просто используйте предоставленную строку. Это работает! Спасибо.
jedmao 15.05.2013 01:00:09
Это довольно просто сказать, JSON.parse("TRUE".toLowerCase())чтобы он мог правильно разобрать.
Yuck 8.08.2013 15:00:49
почему так много голосов? Это неэффективно и ужасно. Что дальше? 'true'.length === 4?
Maksim Vi. 19.11.2016 10:12:54
@MaksimVi. typeof str==="string"&& str.length===4&& str.charAt(0)==="t" && str.charAt(1)==="r" && str.charAt(2)==="u" && str.charAt(3)==="e"&& true===true && true!==false && false===false// просто чтобы быть уверенным
Vitim.us 8.05.2017 15:27:46

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

Например:

<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>

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

4
14.03.2012 20:39:03

Как сказал @ Shadow2531, вы не можете просто конвертировать его напрямую. Я бы также предложил, чтобы вы рассматривали строковые входы помимо «true» и «false», которые являются «truey» и «falsey», если ваш код будет повторно использоваться / использоваться другими. Это то, что я использую:

function parseBoolean(string) {
  switch (String(string).toLowerCase()) {
    case "true":
    case "1":
    case "yes":
    case "y":
      return true;
    case "false":
    case "0":
    case "no":
    case "n":
      return false;
    default:
      //you could throw an error, but 'undefined' seems a more logical reply
      return undefined;
  }
}
8
5.04.2012 18:22:02

@guinaps> Любая строка, которая не является пустой строкой, будет иметь значение true, используя их.

Как насчет использования метода String.match ()

var str="true";
var boolStr=Boolean(str.match(/^true$/i)); 

одно это не получит 1/0 или да / нет, но оно также поймает ИСТИНА / истина, а также вернет ложь для любой строки, в которой в качестве подстроки указано «истина».

РЕДАКТИРОВАТЬ

Ниже приведена функция для обработки истина / ложь, 1/0, да / нет (без учета регистра)

function stringToBool(str) {
    var bool;
    if (str.match(/^(true|1|yes)$/i) !== null) {
        bool = true;
    } else if (str.match(/^(false|0|no)*$/i) !== null) {
        bool = false;
    } else {
        bool = null;
        if (console) console.log('"' + str + '" is not a boolean value');
    }
    return bool;
}

stringToBool('1'); // true
stringToBool('No'); // false
stringToBool('falsey'); // null ("falsey" is not a boolean value.)
stringToBool(''); // false
4
21.08.2012 17:40:12
Как написано (на 2018 19 декабря в 16:00 Z), /^(false|0|no)*$/iбудет соответствовать пустой (которая может быть намерение) , но и совпадает с любым количеством false, 0или no, например , "0falseno0nofalse0"будет также оценить, falseно следует оценить, nullи вывод сообщения консоли что это не булево значение.
Zarepheth 19.12.2018 16:02:55

Boolean.parse()существует в некоторых реализациях браузера. Он определенно не универсален, поэтому, если это то, что вам нужно, вы не должны использовать этот метод. Но в Chrome, например (я использую v21) он работает просто отлично, как и следовало ожидать.

1
20.08.2012 12:45:05
Boolean("false")=>true
thisismydesign 5.03.2020 11:11:45

Я использовал этот фрагмент для преобразования чисел и логических значений:

var result = !isNaN(value) ? parseFloat(value) : /^\s*(true|false)\s*$/i.exec(value) ? RegExp.$1.toLowerCase() === "true" : value;
1
23.10.2012 12:41:10

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

/^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
13
22.01.2013 16:05:15

Мой взгляд на этот вопрос заключается в том, что он направлен на достижение трех целей:

  • Верните true / false для значений truey и falsey, но также верните true / false для нескольких строковых значений, которые были бы true или false, если бы они были булевыми, а не строковыми.
  • Во-вторых, предоставьте упругий интерфейс, чтобы значения, отличные от указанных, не сработали, а вернули значение по умолчанию
  • В-третьих, делайте все это, используя как можно меньше кода.

Проблема с использованием JSON заключается в том, что он не работает, вызывая ошибку Javascript. Это решение не является устойчивым (хотя оно удовлетворяет 1 и 3):

JSON.parse("FALSE") // fails

Это решение не является достаточно кратким:

if(value === "TRUE" || value === "yes" || ...) { return true; }

Я работаю над решением этой проблемы для Typecast.js . И лучшее решение для всех трех целей это:

return /^true$/i.test(v);

Он работает во многих случаях, не дает сбоя при передаче значений типа {} и очень лаконичен. Кроме того, он возвращает значение false в качестве значения по умолчанию, а не неопределенного значения или выдачи ошибки, что более полезно при разработке свободно написанного Javascript. Браво на другие ответы, которые предложили это!

7
26.01.2013 23:02:50
Если вернуться к вашим целям, единственная проблема вашего третьего и лучшего решения состоит в том, что оно не соответствует Цели # 1 - оно вернет true только для значения 'true', но не для любого достоверного ввода. Для того, чтобы оно соответствовало Задаче № 1, оно лишь немного более кратко, чем Решение № 2, и гораздо менее читабельно.
JMTyler 9.05.2013 18:27:36
return /^(true|yes|1|t|y)$/i.test(str);
Kevin Boucher 8.07.2016 20:10:02

Основываясь на ответе Стивена выше, я написал эту функцию как универсальный парсер для ввода строки:

parse:
  function (value) {
    switch (value && value.toLowerCase()) {
      case null: return null;
      case "true": return true;
      case "false": return false;
      default: try { return parseFloat(value); } catch (e) { return value; }
    }
  }
1
9.03.2013 03:55:29

Вам даже не нужно преобразовывать строку в логическое значение. просто используйте следующее: var yourstring = yourstringValue == 1 ? true : false;

1
5.06.2013 10:45:48

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

/**
 * @example
 * <code>
 * var pageRequestParams = {'enableFeatureX': 'true'};
 * toBool(pageRequestParams.enableFeatureX);  // returns true
 *
 * toBool(pageRequestParams.enableFeatureY, true, options.enableFeatureY)
 * </code>
 * @param {*}value
 * @param {Boolean}[mapEmptyStringToTrue=false]
 * @param {Boolean}[defaultVal=false] this is returned if value is undefined.
 *
 * @returns {Boolean}
 * @example
 * <code>
 * toBool({'enableFeatureX': ''        }.enableFeatureX);          // false
 * toBool({'enableFeatureX': ''        }.enableFeatureX, true);    // true
 * toBool({                            }.enableFeatureX, true);    // false
 * toBool({'enableFeatureX': 0         }.enableFeatureX);          // false
 * toBool({'enableFeatureX': '0'       }.enableFeatureX);          // false
 * toBool({'enableFeatureX': '0 '      }.enableFeatureX);          // false
 * toBool({'enableFeatureX': 'false'   }.enableFeatureX);          // false
 * toBool({'enableFeatureX': 'falsE '  }.enableFeatureX);          // false
 * toBool({'enableFeatureX': 'no'      }.enableFeatureX);          // false
 *
 * toBool({'enableFeatureX': 1         }.enableFeatureX);          // true
 * toBool({'enableFeatureX': '-2'      }.enableFeatureX);          // true
 * toBool({'enableFeatureX': 'true'    }.enableFeatureX);          // true
 * toBool({'enableFeatureX': 'false_'  }.enableFeatureX);          // true
 * toBool({'enableFeatureX': 'john doe'}.enableFeatureX);          // true
 * </code>
 *
 */
var toBool = function (value, mapEmptyStringToTrue, defaultVal) {
    if (value === undefined) {return Boolean(defaultVal); }
    mapEmptyStringToTrue = mapEmptyStringToTrue !== undefined ? mapEmptyStringToTrue : false; // default to false
    var strFalseValues = ['0', 'false', 'no'].concat(!mapEmptyStringToTrue ? [''] : []);
    if (typeof value === 'string') {
        return (strFalseValues.indexOf(value.toLowerCase().trim()) === -1);
    }
    // value is likely null, boolean, or number
    return Boolean(value);
};
2
24.06.2013 00:11:53
    MyLib.Convert.bool = function(param) {
         var res = String(param).toLowerCase();
         return !(!Boolean(res) || res === "false" || res === "0");
     }; 
1
23.06.2013 19:39:41

Вот моя 1 строка представления: мне нужно было оценить строку и вывод, true, если 'true', false, если 'false', и число, если что-нибудь вроде '-12.35673'.

val = 'false';

val = /^false$/i.test(val) ? false : ( /^true$/i.test(val) ? true : val*1 ? val*1 : val );
2
18.01.2014 15:03:36

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

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

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

16
31.07.2013 03:57:57