Могу ли я преобразовать строку, представляющую логическое значение (например, 'true', 'false') во внутренний тип в JavaScript?
У меня есть скрытая форма в HTML, которая обновляется на основе выбора пользователя в списке. Эта форма содержит некоторые поля, которые представляют логические значения и динамически заполняются внутренним логическим значением. Однако, как только это значение помещается в скрытое поле ввода, оно становится строкой.
Единственный способ определить логическое значение поля после его преобразования в строку - это зависеть от литерального значения его строкового представления.
var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';
Есть ли лучший способ сделать это?
javascript
Kevin
источник
источник
string=(string==String(string?true:false))?(string?true:false):(!string?true:false);
function parseBool(val) { return val === true || val === "true" }
function checkBool(x) { if(x) {return true;} else {return false;} }
if (checkBool(x) != false) { ... } else { ... }
!!(parseInt(value) || value === "true")
Ответы:
Делать:
Вы можете сделать его более строгим, используя оператор идентификации (
===
), который не делает никаких неявных преобразований типов, когда сравниваемые переменные имеют разные типы, вместо оператора равенства (==
).Не рекомендуется:
Вы, вероятно, должны быть осторожны при использовании этих двух методов для ваших конкретных потребностей:
Любая строка, которая не является пустой строкой, будет оценена
true
с использованием их. Хотя это самые чистые методы, которые я могу придумать в отношении логического преобразования, я думаю, что это не то, что вы ищете.источник
myValue === 'true';
точно эквивалентноmyValue == 'true';
. Там нет никакой выгоды в использовании===
более чем==
здесь.===
и!==
всякий раз, когда это имеет смысл, что почти всегда.==
против»===
- один из немногих, в которых я не участвую . Я совершенно не согласен с тем, что его «почти всегда» имеет смысл использовать===
. Существуют слабо типизированные языки, потому что мы не хотим заботиться о типе; если мы проверяем что-то вроде этого,if (price >= 50)
нам все равно, начинается ли оно как строка. Я говорю, что в большинстве случаев мы хотим , чтобы типы были подтасованы. В тех редких случаях, когда мы не хотим жонглировать типами (напримерif (price === null)
), мы используем===
. Это то, что я делал годами, и у меня никогда не было проблем.Предупреждение
Этот устаревший ответ с большим количеством голосов является технически правильным, но он охватывает только очень специфический сценарий, когда ваше строковое значение ТОЧНО
"true"
или"false"
.Недопустимая строка json, переданная в эти функции ниже, БУДЕТ генерировать исключение .
Оригинальный ответ:
Как насчет?
или с помощью jQuery
источник
JSON.parse("TRUE".toLowerCase())
чтобы он мог правильно разобрать.'true'.length === 4
?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
// просто чтобы быть увереннымисточник
"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;}
false
.default: return true;
конечно возможно. Но это изменило бы поведение функции.Я думаю, что это очень универсально:
if (String(a) == "true")
...Идет:
источник
String(a).toLowerCase() === 'true'
String("what about input like this that isn't a bool?") == "true"
String()
конструктор:true+'' === 'true' // true
Не забудьте сопоставить регистр:
Кроме того, если это флажок элемента формы, вы также можете определить, установлен ли флажок:
Предполагая, что, если это проверено, это "установлено" равным true. Это оценивается как истина / ложь.
источник
myValue
произойдетnull
,true
или какой-то другой тип ...Вы можете использовать регулярные выражения:
Если вам нравится расширять класс String, вы можете сделать:
Для тех (см. Комментарии), которые хотели бы расширить объект String, чтобы получить это, но беспокоятся о перечисляемости и беспокоятся о конфликте с другим кодом, который расширяет объект String:
(Конечно, не будет работать в старых браузерах, и Firefox показывает false, в то время как Opera, Chrome, Safari и IE показывают true. Ошибка 720760 )
источник
Object.defineProperty
.parseBool
Вуд-глаз, будь осторожен. Увидев последствия после применения верхнего ответа с 500+ ответами, я чувствую себя обязанным опубликовать что-то действительно полезное:
Начнем с самого короткого, но очень строгого способа:
И покончим с правильным, более терпимым способом:
Тестирование:
источник
false
логическое значение с помощьюJSON.parse
? С точки зрения процессора, производительности памятиЯ думал, что ответ @Steven был лучшим и позаботился о гораздо большем количестве случаев, чем если бы входящее значение было просто строкой. Я хотел бы немного его расширить и предложить следующее:
Нет необходимости покрывать все
false
случаи, если вы уже знаете всеtrue
случаи, которые вам придется учитывать. Вы можете передать в этот метод что угодно, что может передатьtrue
значение (или добавить другие, это довольно просто), и все остальное будет рассмотреноfalse
источник
autocomplete="on"
Универсальное решение с анализом JSON:
ОБНОВЛЕНИЕ (без JSON):
Я также создал скрипку, чтобы проверить ее http://jsfiddle.net/remunda/2GRhG/
источник
getBool(undefined)
произойдет сбой при использовании исходной версии JSON и вернет true для 2-й версии. Вот третья версия, которая возвращает false: function getBool (val) {var num; return val! = null && (! isNaN (num = + val)? !! num: !! String (val) .toLowerCase (). replace (!! 0, '')); }Ваше решение в порядке.
Использование
===
в этом случае будет просто глупым, так как полеvalue
всегда будет aString
.источник
===
? С точки зрения производительности было бы точно так же, если оба типа являются строками. Во всяком случае, я скорее использую,===
так как я всегда избегаю использования==
и!=
. Обоснования: stackoverflow.com/questions/359494/…value
всегда будетstring
ни==
ни===
глупо. Оба являются подходящим инструментом для этой работы. Они отличаются только тогда, когда типы не равны. В этом случае===
просто возвращаетfalse
while,==
выполняя сложный алгоритм приведения типа перед сравнением.Это возвращает
false
для каждого falsy значения иtrue
для каждого значения truthy за исключением'false'
,'f'
,'no'
,'n'
, и'0'
(без учета регистра).источник
У логического объекта нет метода parse.
Boolean('false')
возвращает true, так что это не сработает.!!'false'
также возвращаетсяtrue
, так что это тоже не сработает.Если вы хотите, чтобы строка
'true'
возвращала логическое значение,true
а строка'false'
возвращала логическое значениеfalse
, то самое простое решение - использоватьeval()
.eval('true')
возвращает true иeval('false')
возвращает false. Имейте в виду последствия для производительности при использовании,eval()
хотя.источник
var isTrueSet = (myValue === 'true');
это лучший ответ.eval('TRUE')
; доказывая еще раз, этоeval()
зло.JSON.parse('TRUE')
из приведенного ниже ответа, также не дает впечатляющих результатов. Довольно просто вызвать условие ошибки в JavaScript (или любом другом языке). Чтобы учесть это, вы должны сначала нормализовать строку, например,var myValue = document.myForm.IS_TRUE.value.toLowerCase(); var isTrueSet = (myValue==='true' || myValue==='false') ? eval(myValue) : false;
.toLowerCase()
в ответ мою точку зрения. Я не пытаюсь ничего форсировать. Прописные буквыTRUE
- это достаточно распространенное значение, которое возвращают многие виджеты пользовательского интерфейса.Это было взято из принятого ответа, но на самом деле у него есть очень слабое место, и я шокирован тем, как он получил это количество голосов, проблема с этим, что вы должны рассмотреть случай строки, потому что это чувствительно к регистру
источник
Я использую следующее:
Эта функция выполняет обычное логическое приведение, за исключением строк «false» (без учета регистра) и «0».
источник
Есть много ответов, и трудно выбрать один. В моем случае при выборе приоритета я выбираю производительность, поэтому я создаю этот jsPerf, который, я надеюсь, сможет пролить здесь немного света.
Краткое изложение результатов (чем выше, тем лучше):
Они связаны с соответствующим ответом, где вы можете найти больше информации (плюсы и минусы) о каждом; особенно в комментариях.
источник
источник
function parseBoolean
вместо этого создайте новоеВыражение, которое вы ищете, просто
как в
Это проверяет
myValue
регулярное выражение без учета регистра и не изменяет прототип.Примеры:
источник
Чтобы преобразовать как строку («истина», «ложь»), так и логическое значение в логическое значение
Где
flag
можноисточник
Уже есть так много доступных ответов. Но в некоторых случаях может быть полезно следующее.
Это может быть полезно, когда один пример с не булевыми значениями.
источник
почему бы тебе не попробовать что-то подобное
Он вернет ошибку, когда задан какой-то другой текст, а не истина или ложь, независимо от регистра, и будет также записывать числа в виде
источник
Эта функция может обрабатывать как строки, так и логические значения true / false.
Демонстрация ниже:
источник
Я использую этот
источник
"true"
илиtrue
. Если придет второй, это не будет работать. Можно лиdocument.prototype
использовать это, где мы хотим?Руки вниз самым простым способом (при условии, что ваша строка будет 'true' или 'false') это:
Всегда используйте оператор === вместо оператора == для этих типов преобразований!
источник
Как сказал @ Shadow2531, вы не можете просто конвертировать его напрямую. Я бы также предложил, чтобы вы рассматривали строковые входы помимо «true» и «false», которые являются «truey» и «falsey», если ваш код будет повторно использоваться / использоваться другими. Это то, что я использую:
источник
Вы должны отделить (в вашем мышлении) значение вашего выбора и представление этого значения.
Укажите точку в логике JavaScript, где им нужно перейти от строковых сторожей к нативному типу, и проведите там сравнение, предпочтительно там, где это делается только один раз для каждого значения, которое необходимо преобразовать. Не забудьте указать, что должно произойти, если строка sentinel не та, которую знает сценарий (т. Е. Используется ли по умолчанию значение true или false?)
Другими словами, да, вам нужно зависеть от значения строки. :-)
источник
Мой взгляд на этот вопрос заключается в том, что он направлен на достижение трех целей:
Проблема с использованием JSON заключается в том, что он не работает, вызывая ошибку Javascript. Это решение не является устойчивым (хотя оно удовлетворяет 1 и 3):
Это решение не является достаточно кратким:
Я работаю над решением этой проблемы для Typecast.js . И лучшее решение для всех трех целей это:
Он работает во многих случаях, не дает сбоя при передаче значений типа {} и очень лаконичен. Кроме того, он возвращает значение false в качестве значения по умолчанию, а не неопределенного значения или выдачи ошибки, что более полезно при разработке свободно написанного Javascript. Браво на другие ответы, которые предложили это!
'true'
, но не для любого достоверного ввода. Для того, чтобы оно соответствовало Задаче № 1, оно лишь немного более кратко, чем Решение № 2, и гораздо менее читабельно.return /^(true|yes|1|t|y)$/i.test(str);
Я немного поздно, но у меня есть небольшой отрывок , чтобы сделать это, по существу , поддерживает все JScripts truthey / falsey / нечисто -ness , но включает в себя
"false"
как acceptible значение для ложных.Я предпочитаю этот метод упомянутым, потому что он не полагается на стороннюю программу для анализа кода (то есть: eval / JSON.parse), что, на мой взгляд, является излишним, он достаточно короткий, чтобы не требовать служебной функции, и поддерживает другие соглашения truthey / falsey.
источник
другое решение. jsFiddle
тесты запускаются в узле
источник
Боже мой, некоторые из этих ответов просто дикие. Я люблю JS и его бесконечное количество способов снять шкуру.
Мое предпочтение, которое я был потрясен, чтобы не видеть, уже:
источник
Один лайнер
Нам просто нужно учитывать "ложную" строку, поскольку любая другая строка (включая "истину") уже есть
true
.Тестовое задание
Более исчерпывающая версия
Тестовое задание
источник