¿Puedo convertir una cadena que representa un valor booleano (por ejemplo, 'verdadero', 'falso') en un tipo intrínseco en JavaScript?
Tengo un formulario oculto en HTML que se actualiza según la selección de un usuario dentro de una lista. Este formulario contiene algunos campos que representan valores booleanos y se completan dinámicamente con un valor booleano intrínseco. Sin embargo, una vez que este valor se coloca en el campo de entrada oculto, se convierte en una cadena.
La única forma que pude encontrar para determinar el valor booleano del campo, una vez que se convirtió en una cadena, era depender del valor literal de su representación de cadena.
var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';
¿Hay una mejor manera de lograr esto?
javascript
Kevin
fuente
fuente
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")
Respuestas:
Hacer:
Podría hacerlo más estricto utilizando el operador de identidad (
===
), que no realiza conversiones de tipo implícitas cuando las variables comparadas tienen tipos diferentes, en lugar del operador de igualdad (==
).No:
Probablemente debería tener cuidado al usar estos dos métodos para sus necesidades específicas:
Cualquier cadena que no sea la cadena vacía se evaluará al
true
usarlas. Aunque son los métodos más limpios que se me ocurren en relación con la conversión booleana, creo que no son lo que estás buscando.fuente
myValue === 'true';
es precisamente equivalente amyValue == 'true';
. No hay ningún beneficio en el uso de===
más de==
aquí.===
y!==
siempre que tenga sentido, que es casi siempre.==
vs.===
es uno de los pocos en los que no. Estoy totalmente en desacuerdo con que "casi siempre" tiene sentido usarlo===
. Los idiomas de tipo libre existen porque no queremos preocuparnos por el tipo; si verificamos algo asíif (price >= 50)
no nos importa si comenzó como una cadena. Yo digo, la mayoría de las veces, queremos que los tipos sean malabarizados. En los raros casos en los que no queremos malabarismos de tipo (por ejemploif (price === null)
), entonces usamos===
. Esto es lo que he hecho durante años y nunca he tenido un problema.Advertencia
Esta respuesta heredada altamente votada es técnicamente correcta pero solo cubre un escenario muy específico, cuando su valor de cadena es EXACTAMENTE
"true"
o"false"
.Una cadena json inválida pasada a estas funciones a continuación lanzará una excepción .
Respuesta original:
¿Qué tal si?
o con jQuery
fuente
JSON.parse("TRUE".toLowerCase())
para que se pueda analizar correctamente.'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
// solo para estar segurofuente
"true"
,"yes"
y"1"
. 2)toLowerCase
no vuelvenull
. 3)Boolean(string)
es lo mismo questring!==""
aquí. =>switch(string.toLowerCase()) {case "false": case "no": case "0": case "": return false; default: return true;}
false
lugar.default: return true;
es ciertamente posible. Pero cambiaría el comportamiento de la función.Creo que esto es mucho universal:
if (String(a) == "true")
...Va:
fuente
String(a).toLowerCase() === 'true'
String("what about input like this that isn't a bool?") == "true"
String()
constructor:true+'' === 'true' // true
Recuerde hacer coincidir mayúsculas y minúsculas:
Además, si se trata de una casilla de verificación de elemento de formulario, también puede detectar si la casilla de verificación está marcada:
Suponiendo que si está marcada, se "establece" igual a verdadero. Esto se evalúa como verdadero / falso.
fuente
myValue
sucedenull
,true
o algún otro tipo ...Puedes usar expresiones regulares:
Si te gusta extender la clase String puedes hacer:
Para aquellos (ver los comentarios) que deseen extender el objeto String para obtener esto, pero están preocupados por la enumeración y están preocupados por chocar con otro código que extiende el objeto String:
(No funcionará en navegadores antiguos, por supuesto, y Firefox muestra falso, mientras que Opera, Chrome, Safari e IE muestran verdadero. Error 720760 )
fuente
Object.defineProperty
.parseBool
Ojo de madera ten cuidado. Después de ver las consecuencias después de aplicar la respuesta principal con más de 500 votos a favor, me siento obligado a publicar algo que sea realmente útil:
Comencemos con la forma más corta pero muy estricta:
Y termine con una forma adecuada y más tolerante:
Pruebas:
fuente
false
valor booleanoJSON.parse
? En términos de CPU, rendimiento de la memoriaPensé que la respuesta de @Steven era la mejor, y me ocupé de muchos más casos que si el valor entrante fuera solo una cadena. Quería extenderlo un poco y ofrecer lo siguiente:
No es necesario cubrir todos los
false
casos si ya conoce todos lostrue
casos que tendría que tener en cuenta. Puede pasar cualquier cosa a este método que pueda pasar por untrue
valor (o agregar otros, es bastante sencillo), y todo lo demás se consideraríafalse
fuente
autocomplete="on"
Solución universal con análisis JSON:
ACTUALIZACIÓN (sin JSON):
También creé el violín para probarlo http://jsfiddle.net/remunda/2GRhG/
fuente
getBool(undefined)
se bloqueará al usar la versión original de JSON y volverá verdadero para la segunda versión. Aquí hay una tercera versión que devuelve false: function getBool (val) {var num; return val! = null && (! isNaN (num = + val)? !! num: !! String (val) .toLowerCase (). replace (!! 0, '')); }Tu solución está bien.
Usar
===
sería simplemente una tontería en este caso, ya que el campovalue
siempre será aString
.fuente
===
? En términos de rendimiento, sería exactamente el mismo si ambos tipos son cadenas. De todos modos, prefiero usar===
ya que siempre evito el uso de==
y!=
. Justificaciones: stackoverflow.com/questions/359494/…value
que siempre será unstring
ni==
ni===
son tontos. Ambas son la herramienta adecuada para este trabajo. Solo difieren cuando los tipos no son iguales. En ese caso,===
simplemente regresafalse
mientras==
ejecuta un intrincado algoritmo de coerción de tipo antes de la comparación.Esto devuelve
false
para cada valor Falsy ytrue
para cada valor Truthy a excepción de'false'
,'f'
,'no'
,'n'
, y'0'
(mayúsculas y minúsculas).fuente
El objeto booleano no tiene un método de 'análisis'.
Boolean('false')
devuelve verdadero, por lo que eso no funcionará.!!'false'
también regresatrue
, así que eso no funcionará también.Si desea que string
'true'
devuelva booleantrue
y string'false'
que devuelva booleanfalse
, entonces la solución más simple es usareval()
.eval('true')
devuelve verdadero yeval('false')
devuelve falso. Sineval()
embargo, tenga en cuenta las implicaciones de rendimiento al usar .fuente
var isTrueSet = (myValue === 'true');
es la mejor respuesta.eval('TRUE')
; probando una vez más, esoeval()
es malo.JSON.parse('TRUE')
de la respuesta a continuación también falla espectacularmente. Es bastante fácil forzar una condición de error en JavaScript (o cualquier idioma, para el caso). Para tener en cuenta esto, primero debe normalizar la cadena, por ejemplo,var myValue = document.myForm.IS_TRUE.value.toLowerCase(); var isTrueSet = (myValue==='true' || myValue==='false') ? eval(myValue) : false;
.toLowerCase()
en la respuesta es mi punto. No estoy tratando de forzar nada. MayúsculasTRUE
es un valor lo suficientemente común como para ser devuelto por muchos widgets de IU.Esto se ha tomado de la respuesta aceptada, pero en realidad tiene un punto muy débil, y estoy sorprendido de cómo obtuvo esa cantidad de votos positivos, el problema es que debes considerar el caso de la cadena porque distingue entre mayúsculas y minúsculas.
fuente
Yo uso lo siguiente:
Esta función realiza la coerción booleana habitual, con la excepción de las cadenas "false" (sin distinción entre mayúsculas y minúsculas) y "0".
fuente
Hay muchas respuestas y es difícil elegir una. En mi caso, priorizo el rendimiento al elegir, así que creo este jsPerf que espero pueda arrojar algo de luz aquí.
Resumen de resultados (cuanto más alto, mejor):
Están vinculados a la respuesta relacionada donde puede encontrar más información (pros y contras) sobre cada uno; especialmente en los comentarios.
fuente
fuente
function parseBoolean
lugarLa expresión que estás buscando simplemente es
como en
Esto prueba
myValue
contra una expresión regular, no distingue entre mayúsculas y minúsculas, y no modifica el prototipo.Ejemplos:
fuente
Para convertir cadenas ("verdadero", "falso") y booleano a booleano
Donde
flag
puede serfuente
Ya hay tantas respuestas disponibles. Pero seguir puede ser útil en algunos escenarios.
Esto puede ser útil cuando hay ejemplos con valores no booleanos.
fuente
por qué no intentas algo como esto
Devolverá un error cuando se proporcione algún otro texto en lugar de verdadero o falso, independientemente del caso y capturará los números también como
fuente
Esta función puede manejar cadenas y booleanos verdadero / falso.
Demostración a continuación:
fuente
Estoy usando este
fuente
"true"
otrue
. Si viene el segundo, esto no funcionará. ¿Es posible hacer undocument.prototype
uso de esto donde lo queramos?Sin duda, la forma más fácil (suponiendo que su cadena sea 'verdadera' o 'falsa') es:
¡Utilice siempre el operador === en lugar del operador == para este tipo de conversiones!
fuente
Como dijo @ Shadow2531, no puedes convertirlo directamente. También te sugiero que consideres entradas de cadena además de "verdadero" y "falso" que son 'veraces' y 'falsas' si tu código va a ser reutilizado / usado por otros. Esto es lo que uso:
fuente
Necesita separar (en su pensamiento) el valor de sus selecciones y la representación de ese valor.
Elija un punto en la lógica de JavaScript donde necesiten pasar de centinelas de cadena a tipo nativo y haga una comparación allí, preferiblemente donde solo se haga una vez por cada valor que deba convertirse. Recuerde abordar lo que debe suceder si la secuencia centinela no es una que el script conoce (es decir, ¿está predeterminado en verdadero o falso?)
En otras palabras, sí, debe depender del valor de la cadena. :-)
fuente
Mi opinión sobre esta pregunta es que tiene como objetivo satisfacer tres objetivos:
El problema con el uso de JSON es que falla al causar un error de Javascript. Esta solución no es resistente (aunque satisface 1 y 3):
Esta solución no es lo suficientemente concisa:
Estoy trabajando para resolver este problema exacto para Typecast.js . Y la mejor solución para los tres objetivos es esta:
Funciona para muchos casos, no falla cuando se pasan valores como {} y es muy conciso. Además, devuelve falso como el valor predeterminado en lugar de indefinido o arrojando un error, que es más útil en el desarrollo de JavaScript sin tipo. Bravo por las otras respuestas que lo sugirieron!
fuente
'true'
, pero no por ningún aporte verdadero. Para que cumpla con el Objetivo n. ° 1, es solo un poco más conciso que la Solución n. ° 2 y mucho menos legible.return /^(true|yes|1|t|y)$/i.test(str);
Llego un poco tarde, pero tengo un pequeño fragmento para hacer esto, esencialmente mantiene todos los JScripts truthey / falsey / asqueroso, pero incluye
"false"
como un valor aceptable para falso.Prefiero este método a los mencionados porque no depende de un tercero para analizar el código (es decir: eval / JSON.parse), lo cual es excesivo en mi opinión, es lo suficientemente corto como para no requerir una función de utilidad y mantiene otras convenciones de truthey / falsey.
fuente
otra solución. jsFiddle
los casos de prueba se ejecutan en el nodo
fuente
Dios santo, algunas de estas respuestas son simplemente salvajes. Me encanta JS y su infinito número de formas de pelar un bool.
Mi preferencia, que me sorprendió no ver ya, es:
fuente
Un trazador de líneas
Solo tenemos que tener en cuenta la cadena "falsa" ya que cualquier otra cadena (incluida la "verdadera") ya está
true
.Prueba
Una versión más exhaustiva.
Prueba
fuente