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

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

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

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

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

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

Просто чтобы выделить странный пример избежания сравнения тройного равенства: у меня есть функция currentSortDirection(), которая возвращает 1 для сортировки по возрастанию, 0 для сортировки по убыванию и -1 для не заданной. Использование while (currentSortDirection() != desiredSortDirection) { sortColumn() } отлично работает, поскольку -1 != trueи-1 != false ... но изменение этого параметра на while (Boolean(currentSortDirection) !== ...) {...} заставляет -1 превратиться в true, что требует дополнительной пары строк подготовки, просто чтобы сделать jshint счастливым.

Droogans 10.11.2013 21:56

Возможный дубликат stackoverflow.com/questions/263965

Rodrigo Siqueira 11.11.2013 15:56

@Droogans: Что произойдет, если для desiredSortDirection установлено значение asc? Я знаю, что в контролируемой среде вы, вероятно, контролируете значение, установленное для desiredSortDirection, но в общей среде, когда ввод desiredSortDirection может поступать из любого места в любой форме, проверка типов для пользовательских объектов и защитное программирование могут сэкономить много часов отладки. Ваш код в порядке, и в нем нет ничего плохого, я просто указываю, что не существует универсального ответа / решения, и оно всегда будет зависеть от сценария.

Nope 24.04.2014 20:19

"Есть ли лучший способ добиться этого?" - есть конечно способ похуже: D string=(string==String(string?true:false))?(string?true:fals‌​e):(!string?true:fa‌‌​​lse);

Mark K Cowan 16.04.2015 13:25

Легко работать со струнными и болтами: function parseBool(val) { return val === true || val === "true" }

WickyNilliams 10.09.2015 17:24

статья с хорошим объяснением coding-issues.com/2015/11/…

Ranadheer Reddy 23.06.2016 13:53

@Mark function checkBool(x) { if (x) {return true;} else {return false;} }

Sebi 29.11.2016 18:10

@Sebi: Вы забыли это задокументировать: if (checkBool(x) != false) { ... } else { ... }

Mark K Cowan 29.11.2016 21:21
!!(parseInt(value) || value === "true")
Andrew Luca 22.02.2017 06:58

Вы не можете, это невозможно!

vitaly-t 06.10.2019 22:47

Просто примечание. Меня всегда поражает набор правил синтаксического анализа выражений Javascript, например, 123+44+'2'+1 дает "16721". Каждый + после «2» интерпретируется как операция конкатенации, wow :-D. В то время как PHP дает 170 в качестве ответа, что более прозрачно, потому что в PHP plus нет двусмысленности - он просто используется для арифметических операций. Операция конкатенации выполняется с другим оператором

Agnius Vasiliauskas 11.12.2019 17:39

Я не нашел ответа, который правильно решает комбинацию undefined + string. В итоге я написал для этого однострочник: const StrToBool = (value) => !!value && value !== "false" && parseInt(value) !== 0; Этот лайнер дает следующие результаты: StrToBool(undefined) => false, StrToBool('true') => true, StrToBool('false') => false, StrToBool('0') => false, StrToBool('Whatever') => true, StrToBool('1') => true

Milos Radojevic 09.02.2020 13:06

Зачем тебе это нужно?

user13507084 08.06.2020 01:58

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

Firzok Nadeem 15.06.2020 21:32

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

Firzok Nadeem 15.06.2020 21:32
!myVar.slice(4,5);myVar = 'TRUE' // truemyVar = 'FALSE' // false
ZenAtWork 17.07.2020 19:15

Ответ @AndrewLuca отличный - он обрабатывает undefined, null и все другие типы. Он считает ненулевые числа истинными, а также строку «истиной». И все в сжатой форме.

danbars 28.01.2021 08:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2 841
17
2 344 849
90
Перейти к ответу Данный вопрос помечен как решенный

Ответы 90

Ответ принят как подходящий

Делать:

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

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

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

Не делайте этого:

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

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

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

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

myValue === 'true'; в точности эквивалентен myValue == 'true';. Здесь нет никакого преимущества от использования === по сравнению с ==.
Tim Down 26.08.2010 15:01

Я следую Совет Крокфорда и использую === и !== всякий раз, когда это имеет смысл, что почти всегда.

guinaps 10.02.2011 18:37

Как насчет "ИСТИНА", например, прописных букв?

BMiner 11.08.2011 02:45

@BMiner затем сначала конвертирует myValue в нижний регистр.

Muhd 24.12.2011 00:20

@guinaps Когда это имеет наибольший смысл?

cciotti 22.02.2012 02:07

@cciotti Если вам не нужно неявное приведение типов. ИЛИ, как сказал гинапс, почти всегда.

Aidiakapi 26.04.2012 19:10

Хммм ... как насчет: /^true$/i.test("false ");

manalang 27.09.2012 01:24

@TimDown Верно, если myValue - это строка, если это, например, массив ['true'] или даже массив массивов [['true']], то myValue == 'true' также проверит, что, вероятно, нежелательно :)

epidemian 28.09.2012 23:17

@epidemian: Да. Однако myValue происходит из свойства value ввода формы, поэтому гарантированно является строкой. Я допускаю, что я мог прямо указать на это в своем первоначальном комментарии.

Tim Down 29.09.2012 00:31

@guinaps Я обычно следую совету Крокфорда, но сценарий == vs. === - один из немногих, в которых я этого не делаю. Я, полностью, не согласен с тем, что «почти всегда» имеет смысл использовать ===. Языки со слабой типизацией существовать, потому что мы не хотим заботиться о типе; если мы проверим что-то вроде if (price >= 50), нас не волнует, начиналось ли оно как строка. Я говорю, самый того времени, мы типа хочу, чтобы жонглировать. В тех редких случаях, когда мы не хотим манипулировать типами (например, if (price === null)), мы используем ===. Это то, что я делал годами, и у меня возникла проблема с никогда.

JMTyler 09.05.2013 22:11

@guinaps И да, я знаю, что для того, чтобы быть невероятно правильным, я должен действительно сравнить с parseInt(price, 10), а не просто с price ... но я прошу, чтобы, если вы ответите, вы разумны и нападаете на мою основную концепцию, но не на мои примеры из рук .

JMTyler 09.05.2013 22:16

@JMTyler Полностью согласен. За всю свою карьеру я столкнулся с проблемой только один раз, когда использовал не if (foo !== 0), а if (foo). Подождите ... Крокфорд не советует против который ...

user123444555621 23.06.2013 10:06

@JMTyler может упускать из виду следующего за ним программиста по обслуживанию. Всегда используйте правильный оператор сравнения! Если вы «точно знаете» типы с обеих сторон, но не используете ===, у меня не будет этих знаний при просмотре вашего кода позже. Если ваш код используется повторно, это может стать кошмаром. Если вы ДЕЙСТВИТЕЛЬНО хотите, чтобы ваши типы «жонглировали», как вы говорите, тогда используйте '==', но слишком многие разработчики JS слишком легко поймут это, лучше ужесточить код. Как часто я хочу, чтобы строка false означала логическое значение true?

aikeru 02.07.2013 21:36

Чтобы покрыть верхний регистр: !! ('' + myValue) .toLowerCase (); или (('' + myValue) .toLowerCase () === 'true');

Michael Bushe 28.03.2014 02:58

Я считаю, что Крокфорд слишком цитируется, а некоторые из его JS-соглашений просто плохи. Пример объявления переменной вверху и разделение запятыми чревато ошибками и нецелесообразно; Я говорю «объявить» для удобочитаемости кода и всегда явно использую ключевое слово var.

Daniel Sokolowski 24.06.2014 06:03

Я согласен с объявлением re: переменной вверху. Во-первых, объявление непосредственно перед фактическим использованием заставляет задуматься о «логической» области видимости, в которой вы хотите использовать эту переменную (независимо от того, доступна ли она через закрытие или нет). Во-вторых, в будущем (ES6) вы можете просто заменить эти «var» на «let», и эта логическая область также будет применена.

Hejazzman 04.09.2014 04:10

Чтобы поддержать точку зрения @aikeru, это может закончиться болезненно, если вы позволите price быть строкой (или если вы просто не уверены): if (price >= 50) { price += 10; }

joeytwiddle 23.09.2014 11:08

Boolean («ложь»); дает мне правду!

Tomas 17.10.2014 16:22

Думаю лучший способ - это var isTrueSet = myValue.match(/true/i) && true || false;

jkutianski 01.11.2014 12:51

только что сделал var isPriv = is_priv.toLowerCase () == 'true'; и работал

fuelusumar 20.05.2015 00:41

@TimDown Вы не правы. Попробуйте: var myValue = {toString:function(){return "true"}};

Cezary Daniel Nowak 15.06.2015 18:58

@CezaryDanielNowak: Да. Однако в контексте вопроса myValue исходит из свойства value ввода формы, поэтому гарантированно является строкой. Оказывается, у меня был этот точный обмен с кем-то ранее в комментариях. К сожалению, сейчас я не могу изменить свой первый комментарий, чтобы он был более четким по этому поводу.

Tim Down 16.06.2015 00:25

@guinaps в этом источнике также говорит, что ваши строки не должны быть длиннее 80 символов, хотя мы не использовали перфокарты в течение многих десятилетий. Это бессмысленный и произвольный стандарт. Кроме того, часто бывает достаточно вольного сравнения. Javascript не просто так типизирован.

Hugo Zink 07.10.2015 13:51

Но, например: string = "beep" будет разбирать на false, чего не ожидалось. Может быть, swtich/case - лучший подход, да?

sospedra 02.11.2015 13:56

Да, @HugoZink, Javascript не просто так типизирован, и это не так. «Слабо типизированный» не означает «выполняет случайные, противоречащие интуиции преобразования», и любой, кто объясняет преимущества слабой типизации и Javascript, дискредитирует такое поведение в качестве хорошего примера.

DavidS 03.12.2015 21:52

«ИСТИНА» не является «истиной», потому что в JavaScript есть значение для символов верхнего / нижнего регистра. Следовательно, эти две строки различны по своей природе, и «===» (или даже «==», если на то пошло) вернет false.

TheCuBeMan 12.01.2016 13:20

@TimDown Преимущество использования === здесь заключается в том, чтобы навсегда забыть о == и избежать соблазна использовать его где-либо еще.

Pawel 13.10.2016 18:08

@TimDown и любой другой серьезный разработчик. Когда вы выбираете ==, код становится непоследовательным, и каждый линтер будет жаловаться.

Pawel 14.10.2016 11:45

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

Tim Down 14.10.2016 12:55

Проблема здесь в том, что он не работает ни с 0, ни с 1. Так что это не может быть хорошо.

Pablo S G Pacheco 26.01.2017 16:27
!!(parseInt(value) || value === "true")
Andrew Luca 22.02.2017 06:59

Что, если появляется "True". Когда я проверяю "value = = " true ", он возвращает false ...

Peter Raeves 27.02.2017 12:24

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

MyiEye 19.06.2017 17:13

@ Джеффри Хейл, почему этот ответ был так отредактирован? Первоначальный ответ был по крайней мере таким же правильным. Почему вы решили пометить его как «ненужный», даже если он правильный? Как вы думаете, почему вы можете решить, что лучше?

El Mac 13.04.2018 12:26

@ElMac Я не знаю, что не очевидно в моем редактировании, ни кто и как вы относитесь к этой теме вопросов / ответов. Я улучшил организацию сообщения с заголовками, относящимися к исходному вопросу плаката и поведению операторов '==' и '==='; одобряющий мою правку соглашается. Личное сообщение мне, если вы все еще не уверены, спасибо.

Geoffrey Hale 25.04.2018 04:11
const str = new String("true");, console.info(str == "true"); // will be true, console.info(str === "true"); // will be false Будьте осторожны при использовании === при проверке возможности синтаксического анализа строкового литерала как логического. Я потратил 2 часа впустую из-за этой функции Javascript. Кстати, я хочу сделать отступ в коде выше, но Stackoverflow мне не позволяет. Это действительно расстраивает.
Francesco Jo 20.09.2018 16:35

Я только что сделал это и наблюдал, как он отказывает false == 'false', что должно было быть правдой, но возвращает ложь.

Black Mamba 13.11.2018 09:38

@FrancescoJo вы не можете отступать от кода в комментариях SO. это было бы кошмаром для чтения. Есть причина, по которой он ограничен 512 символами ... тем не менее, двигаясь дальше, я вижу огромную проблему, когда строка используется для логического значения. вы всегда должны быть уверены, что проверяете ОБЕ "истину" и "ложь". Если вы проверяете только на «ложь», все остальное верно. если вы проверяете только «истина», все остальное ложно, даже истинные значения, такие как 1. Если ваша система разбрасывает логические значения в виде строк, я бы исправил эту проблему как можно скорее, а не забинтовал ее. Только мои два цента, и я знаю, что это старое

Zarathuztra 30.10.2019 03:07

Скобки здесь не нужны.

2540625 18.01.2020 05:11

Это так нелогично.

Ketan Patil 29.01.2020 12:29

один из вариантов - использовать JSON.parse("true") === true и JSON.parse("false") === false, хотя это может вызвать исключение, поэтому будьте осторожны.

BotanMan 08.02.2020 01:32

Вы можете обернуть его в блок try{}, чтобы он не генерировал исключение без catch(e){}.

Justin Liu 08.06.2020 00:08

Я бы также добавил в раздел "Не делать" JSON.parse(myVal);, см. Ниже

kahlan88 30.09.2020 18:46

@BlackMamba false == 'false' правдив (правильно), потому что == нечувствителен к типу. Используйте ===, который также проверит тип. В итоге я использовал === везде в своем JS, даже если это было излишним - потому что это помогает избежать глупых ошибок.

kahlan88 30.09.2020 18:48

Большое спасибо

nasangW 03.02.2021 22:27

Не забудьте указать регистр:

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

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

var isTrueSet = document.myForm.IS_TRUE.checked;

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

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

mik01aj 06.02.2015 13:04

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

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

Как вы думаете, почему было бы глупо использовать ===? С точки зрения производительности было бы точно так же, если бы оба типа были строками. В любом случае, я предпочитаю использовать ===, так как я всегда избегаю использования == и !=. Обоснования: stackoverflow.com/questions/359494/…

Mariano Desanze 17.08.2010 23:01

Поскольку value всегда будет string, ни ==, ни === не являются глупыми. Оба являются правильным инструментом для этой работы. Они различаются только тогда, когда типы равны нет. В этом случае === просто возвращает false, в то время как == перед сравнением выполняет сложный алгоритм принуждения типа.

Robert 25.06.2013 09:49

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

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

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

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

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

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

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

/*
 * 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)

Вы всегда можете добавить префикс функции, если боитесь, что она помешает другому коду. Если какой-то код все еще ломается, этот код слишком хрупкий и должен быть исправлен. Если ваша добавленная функция делает объект слишком тяжелым, что вызывает проблемы с производительностью для другого кода, то, очевидно, вы не хотите этого делать. Но я не думаю, что вообще плохая идея - расширять встроенные объекты. Если бы это было так, их также нельзя было бы распространять публично.

Shadow2531 16.07.2011 23:06

@DTrejo @Szymon Я не согласен. Именно для этого и предназначен прототип. Если вы боитесь, что это нарушит (плохой) код, который полагается на for..in, есть способы скрыть свойства от перечисления. См. Object.defineProperty.

devios1 12.09.2011 18:29

Чтобы следовать соглашению, я бы назвал его parseBool.

guzart 05.02.2012 00:52

Логический синтаксический анализ не относится к классу String ... вы бы получили там любое количество парсеров мусора и преобразования. -1 к изменению прототипов в целом. -1 к решениям, которые не поддерживают кроссбраузерность. -1 за плохой дизайн.

Thomas W 15.08.2012 02:40

@chaiguy Это намного сложнее, чем «он существует, и это использование, вот оно, правильное использование». Нет никакого промежутка между именами - ничто не мешает нескольким библиотекам иметь конфликты имен. Использование набора текста может привести к ошибкам - var foo = ""; foo = getValue (); foo.someStringPrototype (); может привести к исключению, потому что getValue () может вернуть null, undefined или другое нестроковое значение.

Joseph Lennox 26.05.2013 22:28

Использование регулярного выражения выполняется медленно. Используя несколько простых циклов и измерения с помощью console.time / console.timeEnd, я обнаружил, что решение с регулярными выражениями примерно на 50-75% медленнее, чем просто проверка равенства с «истинным». Даже если вы используете toLowerCase

jordancpaul 21.09.2013 02:27

Ни одно из этих правил «не модифицируйте прототип» не имеет никакого смысла ... они говорят это только потому, что их научили этому устаревшие профессора колледжей. Сказать не изменять прототип в JS - это то же самое, что сказать, что не пишите расширения на C# ... что, конечно, смешно. Я могу согласиться с тем, что имеет смысл не использовать это, если это какой-то проект, который может быть загружен и использован другими ... если вы используете его в своем собственном приложении или на сайте, тогда нет ничего подобного. ... полное исключение метода - это невежественный подход ... делайте то, что имеет смысл в вашем контексте.

Serj Sagan 06.02.2015 00:35

Вот сравнение производительности всех ответов. stackoverflow.com/a/28588344/2824333

sospedra 18.02.2015 19:17

Используйте тот же метод, но для какой-нибудь специальной служебной функции или чего-то в этом роде. Не увеличивайте строковый прототип даже с помощью defineProperty.

Chev 24.06.2015 21:36

@SerjSagan это нет, то же самое, что и метод расширения в C#, потому что вы получаете доступ к методам расширения, только если вы включаете правильное пространство имен. Изменение экземпляров прототипа влияет на все объекта, который вы изменили в этом экземпляре среды выполнения. Вдобавок, бить утку - дурной тон, если честно, действительно сбивает с толку. как, черт возьми, мне узнать, откуда взялся этот странный метод для строки? Это может быть откуда угодно в моей кодовой базе ..

Dan 07.01.2016 12:36

Я думал, что это идеально: /^\s*(true|1|on)\s*$/.test()

James Gentes 14.08.2020 19:48

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

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

Это идет:

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

Если вы можете получить строку в верхнем регистре или логическое значение, тогда String(a).toLowerCase() === 'true'

pauloya 29.02.2012 16:49
String("what about input like this that isn't a bool?") == "true"
Thomas Eding 20.09.2013 04:16

@ThomasEding false ... что вы хотите, чтобы он вернул?

Snowburnt 25.10.2013 20:22

можно даже сократить, не используя конструктор String(): true+'' === 'true' // true

Todd 15.01.2015 22:12

@Todd: Хороший момент. Возвращает true для строки и логического true; но не для верхнего регистра TRUE. Честно говоря, ответа нет, но ответ можно изменить на if (String(a).toLowerCase == "true"), чтобы учесть это.

Snowman 06.08.2015 12:03

Так в чем разница между этим и ... "true" == "true" или "false" == "true" ?? В обоих случаях вы получите логическое значение исходной строки («истина» -> истина, «ложь» -> ложь). Проблема в том, что НИЧЕГО, кроме «истины» в качестве исходной строки, всегда будет возвращать ложь. Этот код действительно очень прост, но в то же время очень мало универсален.

TheCuBeMan 12.01.2016 13:43

Кстати, для 1 или 0 он также должен иметь значение false или true

Miguel 09.03.2018 21:12

Разве это не противоположность тому, о чем спрашивает OP?

Dima Parzhitsky 23.03.2018 18:19

В отличие от большинства других ответов, это действительно работает с null, отлично

Pluto 14.04.2018 20:21

Почему String(true)=='true', а не true.toString()=='true'? Я полагаю, что это примерно то же самое. Даже ''+true=='true' короче. ;)

James Wilkins 06.09.2019 22:11
if (String(a) == "true"){
  //true block
} else {
  //false block
}
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);
    }
}

На самом деле это можно упростить. 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 09:27

@Robert, милый, но я бы предпочел использовать по умолчанию false.

drigoangelo 21.10.2013 23:55

@drigoangelo Наличие default: return true;, безусловно, возможно. Но это изменило бы поведение функции.

Robert 25.10.2013 01:18

Я подумал, что это лучший ответ, и хотел подробнее остановиться здесь: stackoverflow.com/questions/263965/…

BrDaHa 24.02.2014 04:04

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

jCuga 24.02.2014 04:12

У меня была только одна проблема: что, если будет передано логическое значение true или false. Я изменил переключатель, чтобы обрабатывать его ... String (item) .toLowerCase (). Trim (). Мне нужно, чтобы он обрабатывался, потому что я использую оператор if из шаблона представления. значение json с сервера является логическим, значение формы с предыдущего шага является строковым значением из ввода формы.

Michael Lang 12.11.2015 02:00

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

ranma2913 22.03.2016 20:15

@drigoangelo Я предпочитаю считать непустую строку достоверной (если только указанная строка не является "ложной" или "0")

Brad Kent 18.05.2017 19:46

Здесь мы просто используем if function checkBoolean(string){ if (string) { var str = string.toLowerCase().trim(); if (str === "true" || str === "yes" || str === "1"){ return true; } } return false; }

Himanshu 22.12.2017 10:23
Boolean('false') - это true :-)
Dave Sag 18.09.2018 07:22

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

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

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

-1: Пожалуйста, не поддерживайте использование eval (за исключением, возможно, умных хаков и необходимости).

Thomas Eding 22.01.2010 03:32

это действительно плохое и небезопасное использование eval. и это даже не умно. -1

moo 22.01.2010 03:35
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.toString () вместо true, чтобы быть еще более чистым :-)

tillda 22.02.2011 14:03

Не меняйте глобальные переменные, старайтесь держать изменения изолированными, возможно, вместо этого создайте новый function parseBoolean

Steel Brain 27.08.2018 20:29

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

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

"true".boolean() // returns true "false".boolean() // returns false

Модификация прототипа - очень плохая идея

Szymon Wygnański 07.08.2011 13:18

@ SzymonWygnański: я не согласен. Я не вижу других причин, кроме цикла for - in и встроенной поддержки той же функциональности браузерами. Reg for-inloop: я не могу придумать случая, когда циклы for-in действительно нужны в строке. Встроенная поддержка Reg: мы определенно можем добавить опору прототипа до тех пор, пока не будут поддерживать собственные браузеры, если мы не создаем фреймворк, например, - прототип или jquery и т. д. Подробнее об этом от @Kangax (Perfection kills) здесь. webcache.googleusercontent.com/…

cypher 18.12.2012 13:19

Подумайте: мы можем пойти еще дальше: «true» .checkbox () преобразуется в флажок, или «true» .application () преобразуется в app: D Не только циклы for-in терпят неудачу, но и стиль здесь неправильный. Где бы вы искали код этого определения "логическое значение / флажок / приложение" в большом приложении? Представьте себе мир, в котором каждая библиотека так думает. Не лучше ли определить класс или функцию: checkbox («true») - это просто чище и почти такое же количество букв. Вы никогда не знаете, что если браузеры будут поддерживать вашу пользовательскую функцию, пока она не будет определена как стандарт (например, Object.create и т. д.).

Szymon Wygnański 04.01.2013 00:40

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

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

Чтобы понять, что «неправильно» (или правильно) с eval - просмотрите такие статьи, как javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval, или поищите в stackoverflow «Javascript eval malware»

GrahamMc 22.11.2012 12:52

Я согласен, что var isTrueSet = (myValue === 'true'); - лучший ответ.

thdoan 28.01.2013 11:35

Мне нравится, что это лаконично. Но для базового корпуса eval('TRUE') это совершенно не удается; еще раз доказывая, что eval() - зло.

Snowman 06.08.2015 12:41

@Area 51 Детективная фантастика, точно так же JSON.parse('TRUE') из приведенного ниже ответа также сильно терпит неудачу. Довольно легко вызвать ошибку в JavaScript (или на любом другом языке, если на то пошло). Чтобы учесть это, вы должны сначала нормализовать строку, например, var myValue = document.myForm.IS_TRUE.value.toLowerCase(); var isTrueSet = (myValue==='true' || myValue==='false') ? eval(myValue) : false;

thdoan 07.08.2015 09:10

@ 10basetom: Совершенно верно. Вы должны включить .toLowerCase() в ответ на мою точку зрения. Я ничего не пытаюсь заставить. Прописные буквы TRUE - достаточно распространенное значение, которое может возвращать многие виджеты пользовательского интерфейса.

Snowman 07.08.2015 09:30

Цитата mozzila docs: Warning: Executing JavaScript from a string is an enormous security risk. It is far too easy for a bad actor to run arbitrary code when you use eval().developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…!

Shubham Chaudhary 18.01.2021 18:20

Самый простой способ (при условии, что ваша строка будет «истина» или «ложь»):

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

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

О каком обращении вы говорили? :-)

YMMD 18.05.2012 04:41

При сравнении строки в javascript нет разницы между использованием операторов == или ===, когда преобразования не используются. Здесь вы сравниваете строки, поэтому преобразование типов не выполняется. См. stackoverflow.com/questions/359494/…

ars265 28.12.2012 19:40
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);
    }
}

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

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

В эти функции под БУДЕТ генерировать исключение передана недопустимая строка json.


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

Как насчет?

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

или с jQuery

$.parseJSON("TRUE".toLowerCase());

Проблема в том, что многие потенциальные значения генерируют ошибку синтаксического анализа, которая останавливает выполнение JS. Таким образом, запуск JSON.parse ("FALSE") разрушает Javascript. Я думаю, что суть вопроса не в том, чтобы просто разрешить эти конкретные случаи, но и в том, чтобы быть устойчивым к другим случаям.

BishopZ 27.01.2013 02:52

Отличная точка BishopZ. Я поддержал ваше решение, используя регулярное выражение: /^true$/i.test( myValue )

Luke 07.02.2013 03:19

@ Люк, это решение - именно то, что мне нужно; ну, завернув его в попытку ... уловить, хотя. Я хотел преобразовать в bool только в том случае, если это было логическое значение в строке; в противном случае просто используйте предоставленную строку. Это работает! Спасибо.

jedmao 15.05.2013 05:00

Когда мне нужно разобрать string и создать boolean, это обычно берется из разметки, в основном атрибутов. В таком случае можно использовать функцию JQuery data. var someBool = $('elementselector').data('attributeselector') === true; Это не вызывает исключения.

toniedzwiedz 10.07.2013 21:07

Достаточно просто сказать JSON.parse("TRUE".toLowerCase()), чтобы он мог правильно разобрать.

Yuck 08.08.2013 19:00

Он не работает с ie7, если вы не подключили внешнюю библиотеку JSON.

Ebenezar John Paul 08.07.2014 10:12

Здесь stackoverflow.com/a/28588344/2824333 - сравнение производительности.

sospedra 18.02.2015 19:17

таким образом он всегда анализирует false как значение

fuelusumar 20.05.2015 00:40

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

TheAnimatrix 12.10.2016 10:32

почему так много апвоутов? Это неэффективно и ужасно. Что дальше? 'true'.length === 4?

Maksim Vi. 19.11.2016 13:12

@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 08.05.2017 18:27

рассмотрим также регулярное выражение на этом этапе new RegExp('true','i').test('TrUe')

Danielo 03.06.2020 14:03

Я получил этот ответ из SO (другой вопрос), и меня просто сбило с толку, когда «True» не сработало так, как ожидалось. JSON.parse() не будет работать с логическими значениями, переданными непосредственно из кода C# "True" или "False". Я согласен с тем, что за этот ответ не следовало голосовать. В итоге я использовал явный myValue.toLowerCase() === "true", а затем возвращаю true из своей функции. если он равен только "false", я возвращаю false, иначе я возвращаю undefined, потому что мне казалось, что сопоставление «false», «FALSE» и т. д. отличается от сопоставления «fdajf» (myValue.toLowerCase() === "true" - было бы ложью)

kahlan88 30.09.2020 18:41

Я обнаружил, что использование '1' и пустого значения '' для логических значений работает гораздо более предсказуемо, чем строковые значения 'true' или 'false' ... особенно с формами 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>

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

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

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

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

Как насчет использования метода 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.info('"' + 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

Как написано (19 декабря 2018 года в 16:00 Z), /^(false|0|no)*$/i будет соответствовать пустой строке (которая может быть намерением), но также соответствует любому числу false, 0 или no, например, "0falseno0nofalse0" также будет оценивать как false, но должен оценивать в null и вывести консольное сообщение о том, что это не логическое значение.

Zarepheth 19.12.2018 19:02

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

Boolean("false") => true
thisismydesign 05.03.2020 14:11

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

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

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

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

Я считаю, что этот вопрос преследует три цели:

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

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

JSON.parse("FALSE") // fails

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

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

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

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

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

Просто возвращаясь к вашим целям, единственная проблема с вашим третьим и лучшим решением заключается в том, что оно не соответствует цели №1 - оно вернет истину только для значения 'true', но не для любого правдивого ввода. Чтобы оно соответствовало Цели №1, оно только немного более лаконично, чем Решение № 2, и гораздо менее читабельно.

JMTyler 09.05.2013 22:27
return /^(true|yes|1|t|y)$/i.test(str);
Kevin Boucher 08.07.2016 23:10

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

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

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

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

/**
 * @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);
};
    MyLib.Convert.bool = function(param) {
         var res = String(param).toLowerCase();
         return !(!Boolean(res) || res === "false" || res === "0");
     }; 

Вот мой 1 лайнер: мне нужно было оценить строку и результат: истина, если «истина», ложь, если «ложь», и число, если что-то вроде «-12.35673».

val = 'false';

val = /^false$/i.test(val) ? false : ( /^true$/i.test(val) ? true : val*1 ? val*1 : val );

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

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

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

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

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

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..
function parseBool(value) {
    if (typeof value === "boolean") return value;

    if (typeof value === "number") {
        return value === 1 ? true : value === 0 ? false : undefined;
    }

    if (typeof value != "string") return undefined;

    return value.toLowerCase() === 'true' ? true : false;
}

Для строки я лично вернул бы true для «истины», как и вы, но false только для «ложь» и undefined в противном случае. Вроде того, что вы делали ранее с целочисленным регистром.

Pierre-Adrien 24.03.2015 20:06

Я написал функцию для сопоставления 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;
};

Универсальное решение с парсингом JSON:

function getBool(val) {
    return !!JSON.parse(String(val).toLowerCase());
}

getBool("1"); //true
getBool("0"); //false
getBool("true"); //true
getBool("false"); //false
getBool("TRUE"); //true
getBool("FALSE"); //false

ОБНОВЛЕНИЕ (без JSON):

function getBool(val){ 
    var num = +val;
    return !isNaN(num) ? !!num : !!String(val).toLowerCase().replace(!!0,'');
}

Я также создал скрипку для проверки http://jsfiddle.net/remunda/2GRhG/

Версия "без JSON" имеет недостаток: val = "0"; console.info (!! (+ val || String (val) .toLowerCase (). replace (!! 0, '‌'))); производит истинное

Etienne 22.07.2014 11:42
getBool(undefined) выйдет из строя при использовании исходной версии JSON и вернет true для второй версии. Вот 3-я версия, которая возвращает false: function getBool (val) {var num; return val! = null && (! isNaN (num = + val)? !! num: !! String (val) .toLowerCase (). replace (!! 0, '')); }
Ron Martinez 21.08.2014 17:25

Я прошил третью версию до function getBool(val){ var num = +val; return !!(val && isNaN(num) ? String(val).toLowerCase().replace(!1,'') : num); }jsfiddle.net/p8daruto

kolbyjack 03.03.2021 18:50

Многие из существующих ответов похожи, но большинство игнорирует тот факт, что данный аргумент также может быть объектом.

Вот кое-что, что я только что придумал:

Utils.parseBoolean = function(val){
    if (typeof val === 'string' || val instanceof String){
        return /true/i.test(val);
    } else if (typeof val === 'boolean' || val instanceof Boolean){
        return new Boolean(val).valueOf();
    } else if (typeof val === 'number' || val instanceof Number){
        return new Number(val).valueOf() !== 0;
    }
    return false;
};

... и модульный тест для него

Utils.Tests = function(){
    window.console.info('running unit tests');

    var booleanTests = [
        ['true', true],
        ['false', false],
        ['True', true],
        ['False', false],
        [, false],
        [true, true],
        [false, false],
        ['gibberish', false],
        [0, false],
        [1, true]
    ];

    for (var i = 0; i < booleanTests.length; i++){
        var lhs = Utils.parseBoolean(booleanTests[i][0]);
        var rhs = booleanTests[i][1];
        var result = lhs === rhs;

        if (result){
            console.info('Utils.parseBoolean('+booleanTests[i][0]+') === '+booleanTests[i][1]+'\t : \tpass');
        } else {
            console.info('Utils.parseBoolean('+booleanTests[i][0]+') === '+booleanTests[i][1]+'\t : \tfail');
        }
    }
};

Я подумал, что ответ @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.

Я использую этот, поскольку он охватывает вещи, которые вы получаете от атрибутов XML / HTML ElementNodes, таких как autocomplete = "on".

philk 30.06.2014 16:10

Я бы добавил .trim () перед toLowerCase ()

Luis Lobo Borobia 20.11.2017 21:05

Wood-eye будьте осторожны. Увидев последствия применения первого ответа, набравшего 500+ голосов, я чувствую себя обязанным опубликовать что-то действительно полезное:

Начнем с самого короткого, но очень строгого способа:

var str = "true";
var mybool = JSON.parse(str);

И закончить правильным, более терпимым путем:

var parseBool = function(str) 
{
    // console.info(typeof str);
    // strict: JSON.parse(str)
    
    if (str == null)
        return false;
    
    if (typeof str === 'boolean')
    {
        return (str === true);
    } 
    
    if (typeof str === 'string')
    {
        if (str == "")
            return false;
            
        str = str.replace(/^\s+|\s+$/g, '');
        if (str.toLowerCase() == 'true' || str.toLowerCase() == 'yes')
            return true;
        
        str = str.replace(/,/g, '.');
        str = str.replace(/^\s*\-\s*/g, '-');
    }
    
    // var isNum = string.match(/^[0-9]+$/) != null;
    // var isNum = /^\d+$/.test(str);
    if (!isNaN(str))
        return (parseFloat(str) != 0);
        
    return false;
}

Тестирование:

var array_1 = new Array(true, 1, "1",-1, "-1", " - 1", "true", "TrUe", "  true  ", "  TrUe", 1/0, "1.5", "1,5", 1.5, 5, -3, -0.1, 0.1, " - 0.1", Infinity, "Infinity", -Infinity, "-Infinity"," - Infinity", " yEs");

var array_2 = new Array(null, "", false, "false", "   false   ", " f alse", "FaLsE", 0, "00", "1/0", 0.0, "0.0", "0,0", "100a", "1 00", " 0 ", 0.0, "0.0", -0.0, "-0.0", " -1a ", "abc");


for(var i =0; i < array_1.length;++i){ console.info("array_1["+i+"] ("+array_1[i]+"): " + parseBool(array_1[i]));}

for(var i =0; i < array_2.length;++i){ console.info("array_2["+i+"] ("+array_2[i]+"): " + parseBool(array_2[i]));}

for(var i =0; i < array_1.length;++i){ console.info(parseBool(array_1[i]));}
for(var i =0; i < array_2.length;++i){ console.info(parseBool(array_2[i]));}

Просто помните, что более старым браузерам может потребоваться полифил JSON, если вы используете первый метод.

DRaehal 13.10.2016 19:56

Как быстро преобразовать "ложную" строку в логическое значение false с помощью JSON.parse? Что касается ЦП, производительности памяти

Green 30.12.2016 21:27

Не было бы проще начать с if (str) {...}, чтобы устранить все, что уже является ложным? И внутри этого условия if просто нужно беспокоиться о возврате true, потому что вы уже заканчиваете return false!

Larphoid 02.12.2018 00:51

Имейте в виду, что вы можете сократить многие строковые тесты с помощью (["true", "yes", "1"]. IndexOf (str.toLowerCase (). Trim ())! = -1) и использовать запасной вариант Boolean (str) для обозначения таких вещей, как 'null'

Scott 19.09.2019 23:47

Более короткий способ записать это, мог бы быть var isTrueSet = (myValue === "true") ? true : false; Предполагая, что только «истина» истинна, а другие значения ложны.

Если вы хотите короче, почему бы не написать просто var isTrueSet = myValue === "true";?

jakubiszon 18.12.2014 17:59

Простое решение, которое я использую некоторое время

function asBoolean(value) {

    return (''+value) === 'true'; 

}


// asBoolean(true) ==> true
// asBoolean(false) ==> false
// asBoolean('true') ==> true
// asBoolean('false') ==> false
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());

Я делаю это, что будет обрабатывать 1 = ИСТИНА = да = ДА = истина, 0 = ЛОЖЬ = нет = НЕТ = ложь:

BOOL=false
if (STRING)
  BOOL=JSON.parse(STRING.toLowerCase().replace('no','false').replace('yes','true'));

Замените STRING именем своей строковой переменной.

Если это не null, числовое значение или одна из этих строк: «истина», «ИСТИНА», «ложь», «ЛОЖЬ», «да», «ДА», «нет», «НЕТ» Это вызовет ошибку (намеренно).

JSON.parse может обрабатывать синтаксический анализ «истина» и «ложь» на логические значения, поэтому вам не нужно оборачивать его в Boolean().
whitfin 27.01.2015 13:52

Я использую собственный метод, который включает сначала проверку, существует ли объект, и более интуитивное преобразование в логическое значение:

function str2bool(strvalue){
  return (strvalue && typeof strvalue == 'string') ? (strvalue.toLowerCase() == 'true' || strvalue == '1') : (strvalue == true);
}

Результаты следующие:

var test; // false
var test2 = null; // false
var test3 = 'undefined'; // false
var test4 = 'true'; // true
var test5 = 'false'; // false
var test6 = true; // true
var test7 = false; // false
var test8 = 1; // true
var test9 = 0; // false
var test10 = '1'; // true
var test11 = '0'; // false

Рабочий пример: http://jsfiddle.net/av5xcj6s/

Я использую это

String.prototype.maybeBool = function(){

    if ( ["yes", "true", "1", "on"].indexOf( this.toLowerCase() ) !== -1 ) return true;
    if ( ["no", "false", "0", "off"].indexOf( this.toLowerCase() ) !== -1 ) return false;

    return this;

}

"on".maybeBool(); //returns true;
"off".maybeBool(); //returns false;
"I like js".maybeBool(); //returns "I like js"

Это хорошо, но работает только с типом String. Представьте, что для этого нужно использовать переменную, которая может быть "true" или true. Если придет второй, это не сработает. Можно ли заставить document.prototype использовать его там, где мы хотим?

MarceloBarbosa 09.02.2015 21:40

Это выглядит элегантно. Прекрасная работа! Однако я заметил, что перегрузка базовых прототипов в больших JS-приложениях (которые также нуждаются в модульном тестировании) может привести к некоторому неожиданному поведению (а именно, когда вы хотите выполнить итерацию с «for» через массив, у которого есть перегруженный прототип, вы получите некоторые свойства, которых вы обычно не ожидаете). Вы были предупреждены. ;)

cassi.lup 11.03.2015 13:30

ваш вариант, который тоже принимает логическое значение function StringOrElse2Bool (sob) {if (typeof sob === "string") {return ["no", "false", "0", "off"]. indexOf (sob.toLowerCase ())! == -1? false true; } еще {возвращение !! рыдать}

bortunac 02.12.2015 14:48

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

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

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

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

"что-то пошло не так" при попытке просмотреть тест jsPerf

spottedmahn 02.02.2018 20:16

Чтобы оценить как логические, так и логические строки, такие как boolean, я использовал эту простую формулу:

var trueOrStringTrue = (trueOrStringTrue === true) || (trueOrStringTrue === 'true');

Очевидно, что он вернет true как для true, так и для true. Все остальное возвращает false.

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

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

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

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

работает отлично и очень просто:

var boolean = "false";
boolean = (boolean === "true");

//boolean = JSON.parse(boolean); //or this way.. 

чтобы проверить это:

var boolean = "false";
boolean = (boolean === "true");

//boolean = JSON.parse(boolean); //or this way.. 

if (boolean == true){
    alert("boolean = "+boolean);
}else{
    alert("boolean = "+boolean);
}

плохо, я исправил приведенный выше фрагмент - теперь работает. не уверен, как эти кавычки "" попали туда! ; / @HugoZapata

null 12.05.2015 17:07

Но вопрос в том, как преобразовать строку в логическое значение. new Boolean ("false") не работает, поэтому ваш ответ неверен.

Hugo Zapata 12.05.2015 23:08

@HugoZapata обновил ответ, да, был неверным (но странно работал раньше) обновленный ответ теперь работает правильно.

null 15.05.2015 14:18

В чем смысл if / else? Вы предупреждаете об одном и том же в обеих ветках.

foxdonut 25.06.2015 22:34

@foxdonut, потому что, если boolean == false, вы можете сделать что-то другое в инструкции else - предупреждение - это просто пример. хотя это то же самое, он выводит что-то другое, если логическое var = true / false.

null 02.07.2015 17:57

другое решение. 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
> 

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

Одна из функций, которые помогают ускорить выполнение кода в Javascript, - это Оценка короткого замыкания:

As logical expressions are evaluated left to right, they are tested for possible "short-circuit" evaluation using the following rules:

  • false && (anything) is short-circuit evaluated to false.
  • true || (anything) is short-circuit evaluated to true.

Таким образом, если вы хотите проверить строковое значение на предмет true или false в способе тестирования JSON.parse и сохранить высокую производительность, вы можете использовать оператор ||, чтобы исключить медленный код из выполнения в случае, если тестовое значение имеет логический тип.

test === true || ['true','yes','1'].indexOf(test.toString().toLowerCase()) > -1

Поскольку метод Array.prototype.indexOf() является частью стандарта ECMA-262 в 5-й редакции, вам может потребоваться полифил для поддержки старых браузеров.

// Production steps of ECMA-262, Edition 5, 15.4.4.14
// Reference: http://es5.github.io/#x15.4.4.14
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {

    var k;

    // 1. Let O be the result of calling ToObject passing
    //    the this value as the argument.
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }

    var O = Object(this);

    // 2. Let lenValue be the result of calling the Get
    //    internal method of O with the argument "length".
    // 3. Let len be ToUint32(lenValue).
    var len = O.length >>> 0;

    // 4. If len is 0, return -1.
    if (len === 0) {
      return -1;
    }

    // 5. If argument fromIndex was passed let n be
    //    ToInteger(fromIndex); else let n be 0.
    var n = +fromIndex || 0;

    if (Math.abs(n) === Infinity) {
      n = 0;
    }

    // 6. If n >= len, return -1.
    if (n >= len) {
      return -1;
    }

    // 7. If n >= 0, then Let k be n.
    // 8. Else, n<0, Let k be len - abs(n).
    //    If k is less than 0, then let k be 0.
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

    // 9. Repeat, while k < len
    while (k < len) {
      // a. Let Pk be ToString(k).
      //   This is implicit for LHS operands of the in operator
      // b. Let kPresent be the result of calling the
      //    HasProperty internal method of O with argument Pk.
      //   This step can be combined with c
      // c. If kPresent is true, then
      //    i.  Let elementK be the result of calling the Get
      //        internal method of O with the argument ToString(k).
      //   ii.  Let same be the result of applying the
      //        Strict Equality Comparison Algorithm to
      //        searchElement and elementK.
      //  iii.  If same is true, return k.
      if (k in O && O[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}

Чтобы получить логические значения из строки или числа Вот хорошее решение:

var boolValue = Boolean(Number('0'));

var boolValue = Boolean(Number('1'));

Первый вернет false, а второй вернет true.

function isTrue(val) {
    try {
        return !!JSON.parse(val);
    } catch (e) {
        return false;
    }
}

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

Решение было бы таким:

//Currently
var isTrue = 'true';
//In the future (Other developer change the code)
var isTrue = true;
//The solution to both cases
(isTrue).toString() == 'true'

Здесь много причудливых ответов. Действительно удивлен, что никто не опубликовал это решение:

var booleanVal = toCast > '';

Это разрешается в true в большинстве случаев, кроме bool false, number zero и пустой строки (очевидно). Вы можете легко найти другие ложные строковые значения постфактум, например:

var booleanVal = toCast > '' && toCast != 'false' && toCast != '0';  

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

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

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

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

не говоря уже о том, что .toLowerCase может бросить, если myValue равен null или undefined

Angelo Oparah 14.06.2020 12:46

Я использую этот простой подход (с помощью myVarToTest):

var trueValuesRange = ['1', 1, 'true', true];

myVarToTest = (trueValuesRange.indexOf(myVarToTest) >= 0);

Успокойтесь, используя эту библиотеку.

https://github.com/rohmanhm/force-boolean

вам просто нужно написать одну строку

const ForceBoolean = require('force-boolean')

const YOUR_VAR = 'false'
console.info(ForceBoolean(YOUR_VAR)) // it's return boolean false

Это также поддержка для следующих

 return false if value is number 0
 return false if value is string '0'
 return false if value is string 'false'
 return false if value is boolean false
 return true if value is number 1
 return true if value is string '1'
 return true if value is string 'true'
 return true if value is boolean true
var trueVals = ["y", "t", "yes", "true", "gimme"];
var isTrueSet = (trueVals.indexOf(myValue) > -1) ? true : false;

или даже просто

var trueVals = ["y", "t", "yes", "true", "gimme"];
var isTrueSet = (trueVals.indexOf(myValue) > -1);

Подобно некоторым операторам switch, но более компактно. Возвращаемое значение будет истинным только в том случае, если строка является одной из строк trueVals. Все остальное ложно. Конечно, вы можете нормализовать входную строку, чтобы сделать ее строчными и обрезать любые пробелы.

Преобразовать строку в логическое значение

var vIn = "true";
var vOut = vIn.toLowerCase()= = "true"?1:0;

Преобразовать строку в число

var vIn = 0;
var vOut = parseInt(vIn,10/*base*/);

Вот простая функция, которая поможет:

   function convertStringToBool(str){
        return ((str === "True") || (str === "true")) ? true:false;
    }

Это даст следующий результат

convertStringToBool("false") //returns false
convertStringToBool("true") // returns true
convertStringToBool("False") // returns false
convertStringToBool("True") // returns true

не будет ли return str.toLowerCase() === 'true' проще?

serdar.sanri 08.05.2019 18:04

Ах! ты на 100% прав :). Написал этот ответ несколько лет назад. Лучшим способом ES6 достичь того же результата будет: const strToBool = (str) => str.toLowerCase() === 'true'

Dayem Siddiqui 09.05.2019 20:17

Один лайнер

Нам просто нужно учесть строку «false», поскольку любая другая строка (включая «true») уже является true.

function b(v){ return v== = "false" ? false : !!v; }

Тестовое задание

b(true)    //true
b('true')  //true
b(false)   //false
b('false') //false

Более исчерпывающая версия

function bool(v){ return v== = "false" || v== = "null" || v== = "NaN" || v== = "undefined" || v== = "0" ? false : !!v; }

Тестовое задание

bool(true)        //true
bool("true")      //true
bool(1)           //true
bool("1")         //true
bool("hello")     //true

bool(false)       //false
bool("false")     //false
bool(0)           //false
bool("0")         //false
bool(null)        //false
bool("null")      //false
bool(NaN)         //false
bool("NaN")       //false
bool(undefined)   //false
bool("undefined") //false
bool("")          //false

bool([])          //true
bool({})          //true
bool(alert)       //true
bool(window)      //true

Есть ли конкретная причина для использования !!v вместо прямого использования true?

Prashanth Hegde 24.02.2021 11:16
String(true).toLowerCase() == 'true'; // true
String("true").toLowerCase() == 'true'; // true
String("True").toLowerCase() == 'true'; // true
String("TRUE").toLowerCase() == 'true'; // true

String(false).toLowerCase() == 'true'; // false

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

Или true.toString()==='true'. Кроме того, почему вы пишете String(true) и String('true') в нижнем регистре? ржу не могу

James Wilkins 06.09.2019 22:07

Вы можете использовать Function для возврата значения Boolean из строки "true" или "false"

const TRUE_OR_FALSE = str => new Function(`return ${str}`)();

const [TRUE, FALSE] = ["true", "false"];

const [T, F] = [TRUE_OR_FALSE(TRUE), TRUE_OR_FALSE(FALSE)];

console.info(T, typeof T); // `true` `"boolean"`

console.info(F, typeof F); // `false` `"boolean"`

вы можете использовать JSON.parse следующим образом:

   
var trueOrFalse='True';
result =JSON.parse(trueOrFalse.toLowerCase());
if (result==true)
  alert('this is true');
else 
  alert('this is false');

в этом случае важен .toLowerCase

Однако не гарантируется возврат логического значения.

D. Pardal 03.07.2020 19:26

Функция toBoolean возвращает false для null, undefined, ',' false '. Он возвращает истину для любой другой строки:

const toBoolean = (bool) => {
  if (bool === 'false') bool = false
  return !!bool
}

toBoolean('false') // returns false

Значит, он вернет истину для «Ложь», не так ли?

Oskar Berggren 01.11.2017 21:07

@OskarBerggren Это не так. Посмотрите на код, if (bool === 'false') bool = false, затем, когда он запускает return !!bool, он возвращает !!false, который является false.

Justin Liu 31.05.2020 19:05

@JustinLiu jsfiddle, безусловно, оценивает toBoolean('False') в true, что я думаю, вероятно, не очень хорошая идея. Что касается фактического вопроса, который касался строки, представляющей логическое значение, я, честно говоря, думаю, что возвращать true для "any "other" "random" "string" - плохая идея - это должно вызывать ошибку вместо того, чтобы предполагать, что вызывающий, отправивший ошибочную строку, доволен наличием что интерпретируется как true.

Oskar Berggren 01.06.2020 23:06

Я использую его, когда получаю значение из URL / формы или другого источника.

Это довольно универсальный однострочный фрагмент кода.

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

boolResult = !(['false', '0', '', 'undefined'].indexOf(String(myVar).toLowerCase().trim()) + 1);

Результат:

myVar = true;  // true
myVar = 'true';  // true
myVar = 'TRUE';  // true
myVar = '1';  // true
myVar = 'any other value not related to false';  // true

myVar = false; // false
myVar = 'false';  // false
myVar = 'FALSE';  // false
myVar = '0';  // false

Боже, некоторые из этих ответов просто дикие. Мне нравится JS и его бесконечное количество способов избавиться от bool.

Мое предпочтение, которое я был шокирован, чтобы не заметить, это:

testVar = testVar.toString().match(/^(true|[1-9][0-9]*|[0-9]*[1-9]+|yes)$/i) ? true : false;

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

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

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

// 0-> false
// any other number -> true

Эта функция может обрабатывать строку, а также логическое значение true / false.

function stringToBoolean(val){
    var a = {
        'true':true,
        'false':false
    };
    return a[val];
}

Демонстрация ниже:

function stringToBoolean(val) {
  var a = {
    'true': true,
    'false': false
  };
  return a[val];
}

console.info(stringToBoolean("true"));

console.info(typeof(stringToBoolean("true")));

console.info(stringToBoolean("false"));

console.info(typeof(stringToBoolean("false")));

console.info(stringToBoolean(true));

console.info(typeof(stringToBoolean(true)));

console.info(stringToBoolean(false));

console.info(typeof(stringToBoolean(false)));

console.info("============================================ = ");
// what if value was undefined? 
console.info("undefined result:  " + stringToBoolean(undefined));
console.info("type of undefined result:  " + typeof(stringToBoolean(undefined)));
console.info("============================================ = ");
// what if value was an unrelated string?
console.info("unrelated string result:  " + stringToBoolean("hello world"));
console.info("type of unrelated string result:  " + typeof(stringToBoolean(undefined)));

В nodejs с использованием узел-boolify возможно

Результаты логического преобразования

Boolify(true); //true
Boolify('true'); //true
Boolify('TRUE'); //null
Boolify(1); //true
Boolify(2); //null
Boolify(false); //false
Boolify('false'); //false
Boolify('FALSE'); //null
Boolify(0); //false
Boolify(null); //null
Boolify(undefined); //null
Boolify(); //null
Boolify(''); //null

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

Metonymy 25.02.2019 18:50

Это очень легкий вес, а также вы можете проверить, является ли строка логической

Ratan Uday Kumar 26.02.2019 06:32

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

Dan 11.01.2021 20:21

Для TypeScript мы можем использовать функцию:

export function stringToBoolean(s: string, valueDefault: boolean = false): boolean {
    switch(s.toLowerCase())
    {
        case "true":
        case "1":
        case "on":
        case "yes":
        case "y":
            return true;

        case "false":
        case "0":
        case "off":
        case "no":
        case "n":
            return false;
    }

    return valueDefault;
}

Если вы уверены, что испытуемый всегда является строкой, то лучше всего явно проверить, что он равен true.

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

var isTrueSet =
    myValue === true ||
    myValue != null &&
    myValue.toString().toLowerCase() === 'true';

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

Самый простой способ, которым я всегда пользуюсь:

let value = 'true';
let output = value === 'true';

Тернарный оператор не требуется. Только с let output = value === 'true' работает.

zeross 06.06.2019 11:05

пусть значение = 'истина'; пусть output = value === 'true'? истина: ложь; output = true; пусть значение = 'ложь'; пусть output = value === 'true'? истина: ложь; output = false; Что здесь не работает?

panatoni 07.06.2019 15:59

Извините, это недоразумение. Это работает отлично, но излишне. value === 'true' уже возвращает логическое значение, и тернарный оператор не требуется.

zeross 07.06.2019 16:35

Да, конечно, ты прав, я отредактировал свой ответ - моя вина;]

panatoni 17.08.2019 00:03

Я надеюсь, что это наиболее полный вариант использования

function parseBoolean(token) {
  if (typeof token === 'string') {
    switch (token.toLowerCase()) {
      case 'on':
      case 'yes':
      case 'ok':
      case 'ja':
      case 'да':
      // case '':
      // case '':
        token = true;
        break;
      default:
        token = false;
    }
  }
  let ret = false;
  try {
    ret = Boolean(JSON.parse(token));
  } catch (e) {
    // do nothing or make a notification
  }
  return ret;
}

Попробуйте это решение (работает как шарм!):

function convertStrToBool(str)
    {
        switch(String(str).toLowerCase())
            {
                case 'undefined': case 'null': case 'nan': case 'false': case 'no': case 'f': case 'n': case '0': case 'off': case '':
                    return false;
                    break;
                default:
                    return true;
            };
    };

В HTML значения атрибутов в конечном итоге становятся строками. Чтобы смягчить это в нежелательных ситуациях, вы можете использовать функцию для условного синтаксического анализа их в значения, которые они представляют в JavaScript или любом другом интересующем языке программирования.

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

В дополнение к этому JSON.parse имеет оживить параметр, который является функцией. Его также можно использовать для достижения того же.

Давайте назовем строку, имеющую вид логический, «истина», логическая строка. Подобным образом мы можем назвать строку, подобную числу, «1», числовая строка. Затем мы можем определить, является ли строка логическая строка:

const isBooleanString = (string) => ['true', 'false'].some(item => item === string);

После этого нам нужно разобрать логическая строка как JSON методом JSON.parse:

JSON.parse(aBooleanString);

Однако любая строка, которая не является логическая строка, числовая строка или любым строковым объектом или массивом (любой недопустимый JSON), приведет к тому, что метод JSON.parse выдаст SyntaxError.

Итак, вам нужно знать, как его называть, то есть логическая строка. Вы можете добиться этого, написав функцию, которая заставляет вышеуказанный defiend логическая строка проверять и вызывать JSON.parse:

function parse(string){
  return isBooleanString(string) ? JSON.parse(string)
    : string;
}

Можно дополнительно обобщить утилиту isBooleanString, чтобы иметь более широкую перспективу того, что квалифицируется как логическая строка, путем дальнейшей параметризации ее для принятия необязательного массива принятых строк логический:

const isBooleanString = (string, spec = ['true', 'false', 'True', 'False']) => spec.some(item => item === string);

Самый простой способ

a = 'True';
a = !!a && ['1', 'true', 1, true].indexOf(a.toLowerCase()) > -1;

Вот мой function boolify(value = false) { return ["true", "1", "yes", "y", "on"].indexOf(String(value).toLowerCase()) != -1; }

Patrick Matte 01.05.2020 21:59
const result: Boolean = strValue === "true" ? true : false

Многие из существующих ответов используют подход, семантически похожий на этот: но я думаю, что есть смысл упомянуть, что следующего «однострочного» часто бывает достаточно. Например, в дополнение к случаю OP (строки в форме) часто требуется прочитать переменные среды из process.env в NodeJS (значения которых, насколько мне известно, всегда являются строками), чтобы включить или отключить определенное поведение, и обычно они имеют форму SOME_ENV_VAR=1.

const toBooleanSimple = (input) => 
  ['t', 'y', '1'].some(truePrefix => truePrefix === input[0].toLowerCase());

Чуть более надежная и выразительная реализация может выглядеть так:

/**
 * Converts strings to booleans in a manner that is less surprising
 * to the non-JS world (e.g. returns true for "1", "yes", "True", etc.
 * and false for "0", "No", "false", etc.)
 * @param input
 * @returns {boolean}
 */
function toBoolean(input) {
  if (typeof input !== 'string') {
    return Boolean(input);
  }
  const s = input.toLowerCase();
  return ['t', 'y', '1'].some(prefix => s.startsWith(prefix));
}

Юнит-тест (шутка) для этого может выглядеть так:

describe(`toBoolean`, function() {
  const groups = [{
    inputs: ['y', 'Yes', 'true', '1', true, 1],
    expectedOutput: true
  }, {
    inputs: ['n', 'No', 'false', '0', false, 0],
    expectedOutput: false
  }]
  for (let group of groups) {
    for (let input of group.inputs) {
      it(`should return ${group.expectedOutput} for ${JSON.stringify(input)}`, function() {
        expect(toBoolean(input)).toEqual(group.expectedOutput);
      });
    }      
  }
});

Используйте статус if:

function parseBool(str) {
  if (str.toLowerCase() == 'true') {
    var val = true;
  } else if (str.toLowerCase() == 'false') {
    var val = false;
  } else {
    //If it is not true of false it returns undefined.//
    var val = undefined;
  }
  return val;
}
console.info(parseBool(''), typeof parseBool(''));
console.info(parseBool('TrUe'), typeof parseBool('TrUe'));
console.info(parseBool('false'), typeof parseBool('false'));

ПРЕДУПРЕЖДЕНИЕ:Никогда использует этот метод для ненадежного ввода, такого как параметры URL.

Вы можете использовать функцию eval(). Непосредственно передайте вашу строку в функцию eval().

console.info(eval('true'), typeof eval('true'))
console.info(eval('false'), typeof eval('false'))

Есть еще много эффективных и безопасных способов сделать это.

D. Pardal 03.07.2020 19:23

Это не рекомендуемое решение. Подробнее - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

kabirbaidhya 21.09.2020 19:06

Вам даже не нужно использовать переменную, если вы знаете, что 'true' всегда будет в нижнем регистре, вы можете использовать это, которое вернет true или false:

(eval(yourBooleanString == 'true'))

Следует отметить, что использование eval для таких тривиальных случаев НЕ РЕКОМЕНДУЕТСЯ. Прочтите это developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

kabirbaidhya 21.09.2020 19:04

Я думаю, что это можно сделать в 1 лайнере с помощью функции стрелки использования

const convertStringToBoolean = (value) => value ? String(value).toLowerCase() === 'true' : false;

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

const convertStringToBoolean = (value) => value ? String(value).toLowerCase() === 'true' : false;

console.info(convertStringToBoolean("a"));
console.info(convertStringToBoolean(null));
console.info(convertStringToBoolean(undefined));
console.info(convertStringToBoolean("undefined"));
console.info(convertStringToBoolean(true));
console.info(convertStringToBoolean(false));
console.info(convertStringToBoolean(0));
console.info(convertStringToBoolean(1)); // only case which will not work

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

Boolean(<stringVariable>)

Boolean ("false") === true // вывод true

Vaibhav S 10.11.2020 13:38

Простая однострочная операция, если вам нужны логические false и true из строковых значений:

storeBooleanHere = stringVariable= = "true"?true:false;
  • storeBooleanHere - эта переменная будет содержать логическое значение
  • stringVariable - переменная, логическое значение которой хранится как строка

упрощенная версия: storeBooleanHere = stringVariable.toLowerCase ()! == 'false';

Vaibhav S 10.11.2020 13:43

Possible ways to convert String to Boolean Я рекомендую вам создать функцию, подобную третьему варианту на изображении, и поместить ее во вспомогательный класс в качестве экспорта и повторно использовать эту функцию, когда вам нужно.

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

Wyck 26.01.2021 23:58
/// Convert something to boolean
function toBoolean( o ) {
    if ( null !== o ) {
        let t = typeof o;
        if ( "undefined" !== typeof o ) {
            if ( "string" !== t ) return !!o;
            o = o.toLowerCase().trim();
            return "true" === o || "1" === o;
        }
    }
    return false;
}

toBoolean(false) --> false
toBoolean(true) --> true
toBoolean("false") --> false
toBoolean("true") --> true
toBoolean("TRue") --> true
toBoolean("1") --> true
toBoolean("0") --> false
toBoolean(1) --> true
toBoolean(0) --> false
toBoolean(123.456) --> true
toBoolean(0.0) --> false
toBoolean("") --> false
toBoolean(null) --> false
toBoolean() --> false

это так здорово и полезно - большое вам спасибо!

Jonathan Lyon 29.01.2021 01:23

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

    ({'true': true, 'false': false})[myValue];
    ({'true': true, 'false': false})[undefined] // => undefined
    ({'true': true, 'false': false})['true'] // => true
    ({'true': true, 'false': false})['false] // => false

Что мы говорим об этом типе функции?

Aman Bansal 24.01.2021 13:22

если вы уверены, что введены какие-либо значения только в пределах "истина" и "ложь" почему нет :

let x = 'true' ;
//let x= 'false';
let y = x==='true'?true:false;
console.info(typeof(y), y);
function convertBoolean(value): boolean {
    if (typeof value == 'string') {
        value = value.toLowerCase();
    }
    switch (value) {
        case true:
        case "true":
        case "evet": // Locale
        case "t":
        case "e": // Locale
        case "1":
        case "on":
        case "yes":
        case 1:
            return true;
        case false:
        case "false":
        case "hayır": // Locale
        case "f":
        case "h": // Locale
        case "0":
        case "off":
        case "no":
        case 0:
            return false;
        default:
            return null;
    }
}

Самое простое решение ??

с ES6 +

используйте логическое НЕ дважды [!! ], чтобы преобразовать строку

Просто вставьте это выражение ...

const stringToBoolean = (string) => string === 'false' ? false : !!string

И передайте ему свою строку!

stringToBoolean('')                 // false
stringToBoolean('false')            // false
stringToBoolean('true')             // true
stringToBoolean('hello my friend!') // true
?? Bonus! ??
const betterStringToBoolean = (string) => 
  string === 'false' || string === 'undefined' || string === 'null' || string === '0' ?
  false : !!string

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

betterStringToBoolean('undefined')     // false
betterStringToBoolean('null')          // false
betterStringToBoolean('0')             // false
betterStringToBoolean('false')         // false
betterStringToBoolean('')              // false
betterStringToBoolean('true')          // true
betterStringToBoolean('anything else') // true

Другие вопросы по теме