Estaba jugando en jsfiddle.net y tengo curiosidad por saber por qué esto se cumple.
if(0 < 5 < 3) {
alert("True");
}
Entonces, esto:
if(0 < 5 < 2) {
alert("True");
}
Pero esto no:
if(0 < 5 < 1) {
alert("True");
}
¿Es esta peculiaridad alguna vez útil?
javascript
compare
operators
boolean-logic
punkrockbuddyholly
fuente
fuente
Respuestas:
El orden de las operaciones hace
(0 < 5 < 3)
que se interprete en javascript como((0 < 5) < 3)
que produce(true < 3)
y verdadero se cuenta como 1, lo que hace que devuelva verdadero.Esta es también la razón por la que
(0 < 5 < 1)
devuelve falso,(0 < 5)
devuelve verdadero, que se interpreta como1
, lo que resulta en(1 < 1)
.fuente
if(0 < 5 < 1) == false
. Todo está claro ahora, gracias :)((0 < 5) && (5 < 3))
, ya que probablemente haya otros, pero no los conozco.Mi conjetura es porque
0 < 5
es cierto, ytrue < 3
se emite a lo1 < 3
que es cierto.fuente
probablemente porque
true
se supone1
asífuente
Debido a que
true < 3
, debidotrue == 1
fuente
En cuanto a su pregunta sobre si esta peculiaridad es útil alguna vez: supongo que podría haber algún caso en el que sería útil (si el código condensado es lo que busca), pero confiar en él (muy probablemente) reducirá severamente la comprensión de su código.
Es como usar post / pre increment / decrement como parte de expresiones más grandes. ¿Puedes determinar cuál es el resultado de este código de un vistazo?
Nota: con este código, a veces incluso puede obtener resultados diferentes según el idioma y el compilador.
Es una buena idea facilitarle la vida a usted y al próximo tipo que leerá su código. Escriba claramente lo que realmente quiere que suceda en lugar de confiar en los efectos secundarios como la conversión implícita de booleanos.
fuente
result
18 años?La respuesta a la segunda parte de la pregunta, "¿alguna vez es útil esta peculiaridad?" tal vez sea no, como se señaló en una respuesta anterior, si de hecho es una peculiaridad del lenguaje (Javascript) que verdadero se convierte en 1, pero que el programador en general no ve 1 y verdadero (y 0 y falso) como el la misma cosa.
Sin embargo, si tiene un modelo mental de 1 siendo verdadero y 0 siendo falso, entonces conduce a todo tipo de buenas técnicas booleanas que son extremadamente útiles, poderosas y directas. Por ejemplo, podría incrementar un contador directamente con el resultado de A> 100, lo que incrementaría el contador si A es mayor que 100. Esta técnica podría verse como un capricho o un truco en Java, pero en una matriz o lenguaje funcional puede ser idiomático
Un ejemplo clásico en el lenguaje de matriz APL sería contar el número de elementos en una matriz que son (digamos) mayores que 100:
Donde si A es la matriz de 5 elementos 107 22 256 110 3 entonces:
produce la matriz booleana de 5 elementos:
1 0 1 1 0
y sumando este resultado booleano:
da la respuesta final:
3
Esta pregunta es un ejemplo perfecto de dónde esta técnica sería muy útil, especialmente si el problema se generaliza para determinar si n de m valores booleanos son verdaderos.
Compruebe si al menos dos de cada tres booleanos son verdaderos
fuente
Eso es fácil.
Comience de izquierda a derecha para evaluar el primer 0 <5. ¿Es cierto? Si. Como VERDADERO = 1, evalúa 1 <3. Dado que 1 es menor que 3, es cierto.
Ahora con esto
¿Es 0 menos que 5? Si. Así que hazlo VERDADERO, lo que también significa 1. Ahora con ese hecho en mente, se evalúa como (1 <1). ¿1 es menos de 1? No, por lo tanto, es falso. Tiene que ser igual.
fuente
¿está evaluando 0 <5 que devolvería 1 para verdadero cuando 1 <3 que es verdadero?
C # quiere permitirte hacer esto "El operador '<' no se puede aplicar a operandos de tipo 'bool' e 'int'"
fuente
Me encontré con esto hace un tiempo en Obj-C y me sorprendió mucho. Obtuve los resultados que quería haciendo algo como esto:
Lo cual, por supuesto, es falso para que no reciba esa alerta "verdadera". Me alegro de haber leído esto, ahora sé por qué.
fuente
Además de python, CoffeeScript es otro lenguaje que admite comparaciones encadenadas, por lo
3 < x < 10
que se convertiría(3 < x && x < 10)
en vanilla JSfuente
fuente
Un operando booleano cuando se opera sobre un operador matemático devuelve un número. para comprobar esto hacemos
Por lo tanto
0 < 5
, el booleano devuelto (verdadero) operado con el operador matemático (<) devolverá un número. Entonces hierve a 1 <3 lo que devuelvetrue
fuente
porque 0 es menor que 5, entonces devuelve verdadero, y por defecto verdadero es cualquier cosa que incluye y puede evaluarse a 1, que aún es menor que 3, lo que nuevamente devuelve verdadero
fuente
intenta redactar tus resultados como Number ()
o prueba esto:
Busqué en Google esto porque estaba obteniendo
(3 >= 20) //returning true
y supongo que JavaScript estaba tratando de verificar3
como booleano porque estaba obteniendo este valor de laelm.getAttribute();
función queconsole.log();
se imprimía en forma de cadena.fuente