Как преобразовать строку в логическое значение в JavaScript?
Заголовок: Как преобразовать строку, представляющую логическое значение (например, 'true' или 'false'), в встроенный тип в JavaScript?
Описание проблемы:
Я работаю с скрытой формой в HTML, которая обновляется в зависимости от выбора пользователя из списка. Эта форма содержит несколько полей, представляющих логические значения, которые динамически заполняются встроенными логическими значениями. Однако, как только это значение помещается в скрытое поле ввода, оно превращается в строку.
Единственный способ, который я смог найти, чтобы определить логическое значение поля после его преобразования в строку, - это полагаться на буквальное значение его строкового представления:
var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';
Существует ли лучший способ сделать это?
5 ответ(ов)
Делайте:
var isTrueSet = (myValue === 'true');
Используйте оператор строгого равенства (===
), который не производит неявные преобразования типов при сравнении переменных с различными типами.
Это присвоит isTrueSet
булевое значение true
, если строка равна "true", и булевое значение false
, если строка равна "false" или не установлена вовсе.
Чтобы сделать сравнение нечувствительным к регистру, попробуйте:
var isTrueSet = /^true$/i.test(myValue);
// или
var isTrueSet = (myValue?.toLowerCase?.() === 'true');
// или
var isTrueSet = (String(myValue).toLowerCase() === 'true');
Не делайте:
Следует быть осторожным с использованием этих двух методов для ваших конкретных нужд.
var myBool = Boolean("false"); // будет равно true
var myBool = !!"false"; // будет равно true
Любая строка, не являющаяся пустой, будет оценена как true
при использовании этих методов. Хотя они являются наиболее чистыми способами, которые я могу предложить для преобразования в булевый тип, я думаю, что они не соответствуют тому, что вам нужно.
Предупреждение
Этот ответ с высоким рейтингом технически верен, но охватывает лишь очень специфический сценарий, когда ваше строковое значение является ТОЧНО "true"
или "false"
.
Некорректная строка JSON, переданная в функции ниже, ВЫЗОВЕТ исключение.
Основной ответ:
Как насчет такого решения?
JSON.parse("True".toLowerCase());
или с использованием jQuery:
$.parseJSON("TRUE".toLowerCase());
Вот пример функции stringToBoolean
, которая принимает строковое значение и возвращает соответствующее булевое значение:
const stringToBoolean = (stringValue) => {
switch(stringValue?.toLowerCase()?.trim()) {
case "true":
case "yes":
case "1":
return true;
case "false":
case "no":
case "0":
case null:
case undefined:
return false;
default:
return JSON.parse(stringValue);
}
}
Эта функция работает следующим образом:
- Приводит входную строку к нижнему регистру и удаляет лишние пробелы.
- Проверяет на соответствие с известными истинными значениями (
"true"
,"yes"
и"1"
), и если совпадение найдено, возвращаетtrue
. - Аналогично, проверяет на соответствие известным ложным значениям (
"false"
,"no"
,"0"
,null
,undefined
), и в случае совпадения возвращаетfalse
. - Если значение не совпадает ни с одним из указанных случаев, оно передается в
JSON.parse
, чтобы обработать его как JSON (это может быть полезно, например, если передается строка, представляющая логическое значение).
Обратите внимание, что использование JSON.parse
может вызвать ошибку, если строка не является корректным JSON. Убедитесь, что входные данные соответствуют ожидаемым форматам.
Я думаю, это гораздо более универсальный подход:
if (String(a).toLowerCase() == "true")
Вот как это работает:
String(true) == "true" // возвращает true
String(false) == "true" // возвращает false
String("true") == "true" // возвращает true
String("false") == "true" // возвращает false
Такое решение верно обрабатывает различные типы входных данных, преобразуя их в строку и приводя к нижнему регистру, что позволяет надежно сравнивать значение с "true"
.
Запомните, что здесь важен регистр букв:
var isTrueSet = (myValue.toLowerCase() === 'true');
Также, если элемент формы — это чекбокс, вы можете проверить, установлен ли он:
var isTrueSet = document.myForm.IS_TRUE.checked;
При этом предполагается, что если чекбокс отмечен, то он "установлен" в значение true. Это выражение возвращает true или false.
Где найти документацию по форматированию даты в JavaScript?
В чем разница между String.slice и String.substring?
Проверка соответствия строки регулярному выражению в JS
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"