Как преобразовать строку в булево значение в JavaScript правильно?
Проблема: почему Boolean("false") возвращает true?
Вы столкнулись с классическим поведением JavaScript. Функция Boolean() и оператор двойного отрицания !! преобразуют значение в булев тип по правилам истинности (truthy/falsy). В JavaScript любая непустая строка ("false", "0", " ") считается "истинной" (truthy). Только пустая строка "" является "ложной" (falsy). Поэтому Boolean("false") даёт true.
Чтобы преобразовать именно строковое представление "true" и "false" в булевы значения, нужно использовать сравнение.
Простое и надёжное решение
Самый популярный и понятный способ — сравнить строку с литералом "true":
function stringToBoolean(str) {
return str === "true";
}
console.log(stringToBoolean("true")); // true
console.log(stringToBoolean("false")); // false
console.log(stringToBoolean("TRUE")); // false — чувствительно к регистру
console.log(stringToBoolean("")); // false
console.log(stringToBoolean("любая строка")); // false
Объяснение: оператор строгого равенства === сравнивает строку с "true". Если совпадает — возвращаем true, иначе false. Это явно и предсказуемо.
Учёт регистра и других значений
Если вы ожидаете строки "TRUE", "True", "1" или "yes", можно сделать функцию более гибкой:
function toBoolean(str) {
if (typeof str !== 'string') return false;
const truthyValues = ['true', '1', 'yes', 'on'];
return truthyValues.includes(str.toLowerCase().trim());
}
console.log(toBoolean("True")); // true
console.log(toBoolean("YES")); // true
console.log(toBoolean("false")); // false
console.log(toBoolean("0")); // false
console.log(toBoolean(" true ")); // true (trim убирает пробелы)
JSON.parse — элегантный способ для точных значений
Если ваша строка — это строго "true" или "false" (в нижнем регистре), можно использовать JSON.parse. Это стандартный парсер JSON, который корректно преобразует литералы:
let bool = JSON.parse("true"); // true
let bool2 = JSON.parse("false"); // false
// Но будьте осторожны:
// JSON.parse("TRUE") — вызовет ошибку!
// JSON.parse("1") — тоже ошибка
Плюсы: очень лаконично, не нужно писать свою функцию.
Минусы: строгий синтаксис — только "true" и "false" в нижнем регистре. Любое отклонение вызовет исключение.
Рекомендация
- Для простых случаев (только
"true"/"false") используйтеstr === "true". - Если данные приходят из формы или API и могут быть в разных форматах — сделайте небольшую функцию
toBooleanс маппингом. - Не используйте
Boolean(str)или!!strдля этой задачи — они не различают содержимое строки. - Всегда учитывайте регистр и лишние пробелы с помощью
.toLowerCase()и.trim().
Этот подход гарантирует, что вы получите именно то булево значение, которое закодировано в строке, а не результат правил truthy/falsy.
<<Альтернативный подход: использование тернарного оператора
Можно сделать преобразование в одну строку без создания отдельной функции. Это удобно для разовых проверок в коде:
let str = "false";
let bool = str === "true" ? true : false;
// Или короче (но менее читаемо):
let bool2 = str === "true";
Оба варианта эквивалентны. Второй короче, но новичкам может быть неочевидно, что сравнение само возвращает булево значение.
Если нужно обрабатывать "1" и "0"
Иногда сервер присылает "1" и "0" вместо "true"/"false". Вот универсальное однострочное решение:
let bool = ["true", "1", "yes"].includes(str.toLowerCase().trim());
Этот способ возвращает true для любого "истинного" строкового представления и false для всего остального. Он хорошо подходит, когда вы не контролируете формат входных данных.
Важно: всегда проверяйте тип данных перед преобразованием. Если str вдруг окажется undefined или null, вызов .toLowerCase() вызовет ошибку. Добавьте защиту:
let bool = str ? ["true", "1", "yes"].includes(str.toLowerCase().trim()) : false;
Этот подход — хороший компромисс между краткостью и надёжностью для продакшн-кода.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги