Tengo una variable que almacena false
o true
, pero necesito 0
o en su 1
lugar, respectivamente. ¿Cómo puedo hacer esto?
276
Tengo una variable que almacena false
o true
, pero necesito 0
o en su 1
lugar, respectivamente. ¿Cómo puedo hacer esto?
bool === true ? 1 : 0
, ya que es, con mucho, el más rápido en V8.bool ? 1 : 0;
Respuestas:
Javascript tiene un operador ternario que puede usar:
fuente
NaN
. Entonces, si desea L33T y garantiza la entrada, vaya al urinario, de lo contrario, creo que la prueba ternaria + verdadera es la mejor.Use el operador unario
+
, que convierte su operando en un número.Tenga en cuenta, por supuesto, que aún debe desinfectar los datos en el lado del servidor, porque un usuario puede enviar cualquier dato a su servidor, sin importar lo que diga el código del lado del cliente.
fuente
Number()
Es aún más lento.bool === true ? 1 : 0
es el más rápido, con un segundo cercano desdebool | 0
.En mi opinión, la mejor solución es:
Esto se usa en asm.js para forzar el tipo entero.
fuente
1
número entero, ¿no es así si fooBar no lo es?Prefiero usar la función Número . Toma un objeto y lo convierte en un número.
Ejemplo:
Puedes probarlo en un jsFiddle .
fuente
Creé una comparación JSperf de todas las respuestas sugeridas.
TL; DR: la mejor opción para todos los navegadores actuales es:
.
Actualizar:
Parece que en estos días todos son bastante idénticos, excepto que la
Number()
función es la más lenta y la mejorval === true ? 1 : 0;
.fuente
La forma mecanografiada de hacer esto sería:
fuente
Acabo de encontrar este atajo hoy.
~~ (cierto)
~~ (falso)
Gente mucho más inteligente de lo que puedo explicar:
http://james.padolsey.com/javascript/double-bitwise-not/
fuente
Cuando JavaScript espera un valor numérico pero recibe un valor booleano, convierte ese valor booleano en un número: verdadero y falso se convierten en 1 y 0 respectivamente. Entonces puedes aprovechar esto;
Lecturas adicionales Conversiones de tipos Capítulo 3.8 de La Guía definitiva de Javascript.
fuente
El
+
operador unario se encargará de esto:Naturalmente, querrá comprobar esto en el servidor antes de almacenarlo, por lo que de todos modos podría ser un lugar más sensato para hacerlo.
fuente
===
, porquetrue == 1
es cierto incluso Withou la "conversión explícita :-)true === 1
lugar es falso.Estaba lidiando con este problema en algún código que estaba escribiendo. Mi solución fue usar un bit a bit y.
Una forma más rápida de lidiar con un problema constante sería crear una función. Es más legible para otras personas, mejor para comprender en la etapa de mantenimiento, y elimina el potencial de escribir algo mal.
Editar - 10 de septiembre de 2014
Ninguna conversión usando un operador ternario con el operador idéntico es más rápido en Chrome por alguna razón. No tiene sentido por qué es más rápido, pero supongo que es una especie de optimización de bajo nivel que tiene sentido en algún lugar del camino.
Prueba por ti mismo: http://jsperf.com/boolean-int-conversion/2
En Firefox e Internet Explorer, usar la versión que publiqué es más rápido en general.
Editar - 14 de julio de 2017
De acuerdo, no voy a decirte cuál deberías usar o no. Cada maldito navegador ha estado subiendo y bajando en la rapidez con que pueden hacer la operación con cada método. Chrome en un punto en realidad tenía la versión bit a bit y mejor que las otras, pero de repente fue mucho peor. No sé lo que están haciendo, así que lo dejaré a quién le importa. Rara vez hay alguna razón para preocuparse por la rapidez con que se realiza una operación como esta. Incluso en dispositivos móviles es una operación de nada.
Además, aquí hay un método más nuevo para agregar un prototipo 'toInt' que no se puede sobrescribir.
fuente
También puede agregar 0, usar operadores de desplazamiento o xor:
Estos tienen velocidades similares a las de las otras respuestas.
fuente
En mi contexto, React Native donde obtengo el valor de opacidad de booleano, la forma más fácil: usar unario + operador.
Esto convierte el booleano en número;
fuente
Podrías hacer esto simplemente extendiendo el prototipo booleano
No es demasiado fácil entender lo que está sucediendo allí, por lo que una versión alternativa sería
habiendo hecho lo que puedes hacer, como
Cuando uso booleanos para almacenar condiciones, a menudo los convierto en campos de bits, en cuyo caso termino usando una versión extendida de la función prototipo
con lo que puedes hacer
que produce 4 como su salida.
fuente
fuente
tratar
Mostrar fragmento de código
fuente
He probado todos estos ejemplos, hice un punto de referencia, y finalmente le recomiendo que elija el más corto, no afecta el rendimiento.
Resultado
fuente
si desea un valor entero x cambie si 1 a 0 y si 0 a 1 puede usar (x + 1)% 2
fuente