javascript - son - ¿Por qué !! 1== "1" es igual a verdadero y !! 2== "2" ¿es igual a falso?
porque es importante controlar nuestras emociones (5)
De acuerdo con las reglas de precedencia del operador , !
lógico !
tiene mayor prioridad sobre ==
. Entonces, en ambos casos, !!
se evalúa primero
Nota: La verdad de varios objetos ha sido explicada en esta respuesta mía.
Primer caso
!!1 == "1"
!1
se evaluará a false
, ya que 1
se considera Truthy. Negando otra vez nos hacemos true
. Entonces la expresión se vuelve
true == "1"
Ahora, las reglas de coerción se activan como lo ha hecho con el operador ==
, que evalúa de acuerdo con el algoritmo de comparación de igualdad abstracta definido en la especificación ECMAScript 5.1.
6. Si
Type(x)
esBoolean
, devuelva el resultado de la comparaciónToNumber(x) == y
.
Entonces, true
se convertirá en un número, que es 1 según el algoritmo ToNumber
para valores booleanos . Ahora la expresión se vuelve
1 == "1"
Ahora,
4. Si
Type(x)
esNumber
yType(y)
isString
, devuelve el resultado de la comparaciónx == ToNumber(y)
.
Entonces, "1"
se convertirá en un número y dará 1, según el algoritmo ToNumber
. Por eso es true
en el primer caso.
Segundo caso
Las mismas reglas se aplican aquí.
!!2 == "2"
se convierte
true == "2"
entonces
1 == "2"
que se convierte
1 == 2
lo cual no es true
, es por eso que el segundo caso imprime false
.
Como dice el título, ¿por qué?
> !!1=="1"
igual
True
y
> !!2=="2"
igual:
False
Del mismo modo, ¿por qué > "1"==true
igual a true
y > "2"==true
igual a false
Estoy desconcertado. ¿Son solo errores en JS o qué está pasando aquí?
Porque "1" se puede considerar como "verdadero" cuando se hace un control de igualdad, no de identidad, sino de "2": no se puede.
tldr; esto se debe a las conversiones [ToNumber] en el algoritmo del operador ==
.
El primer paso es simplificar la expresión. Dado que !!x=="x"
se analiza como (!!x)=="x"
y !!a_truthy_expression -> true
, la expresión real relevante para la igualdad es
!!1=="2" -> true=="1" -> Boolean==String
!!2=="2" -> true=="2" -> Boolean==String
Entonces, mirando las reglas para 11.9.3 El algoritmo de comparación de igualdad abstracta y siguiendo junto con la aplicación rinde
Regla 6 - Si Tipo (x) es Booleano, devuelva el resultado de la comparación ToNumber (x) == y.
que da como resultado Number==String
o 1 == "1" y 1 == "2", respectivamente 1 . Entonces la regla
Regla 7 - Si Tipo (x) es Número y Tipo (y) es Cadena, devuelva el resultado de la comparación x == Número To (y).
se aplica lo que resulta en Number==Number
o 1 == 1 y 1 == 2, respectivamente 1 ; el último es claramente falso.
Regla 1 - Si Tipo (x) es igual que Tipo (y), entonces [por c.iii.] Si x es el mismo Valor numérico que y, devuelve true [else return false].
(El mismo algoritmo explica el caso String==Boolean
cuando se aplican las reglas complementarias).
1 Para ver la regla [ToNumber] aplicada, considere:
+false -> 0
+true -> 1
+"1" -> 1
+"2" -> 2
!!1
es igual a verdadero, y "1" es igual a verdadero ("0" es falso, lo mismo ocurre con cualquier otra cadena). !!1 == "1"
Entonces !!1 == "1"
evalúa a true == true
, que por supuesto devuelve verdadero.
!!2
también es igual a verdadero. Como mencioné anteriormente, "2" no es "1", entonces es falso. Por lo tanto, tenemos true == false
, que por supuesto devuelve falso.
Si quiere ver si 2 (un número) es igual a "2" (una cadena de representación de un número), entonces todo lo que tiene que hacer es 2 == "2"
, que evalúa a 2 == 2
, que es cierto. La diferencia es que no estamos comparando un booleano con un booleano. Estamos comparando un número con un número.
Básicamente, poniendo !!
delante de un número se convierte en booleano, lo que obliga a JavaScript a convertir su cadena en un booleano en lugar de un número.
Es un problema de operador de precedencia.
El !
el operador es un operador unario. Eso significa que el lado izquierdo debe ser una expresión o una sección evaluable booleana. Ver Javascript MDN .
!!1==1 is not necessary !!(1==1)
!!2==2 is not necessary !!(2==2)
¡Creo que estas expresiones deberían ser consistentes si el operador igual tiene más precedencia que! operador. Pero si consideramos lo contrario, evaluando las primeras negaciones tenemos:
!!1 == 1
!1 -> false
!!1 -> true
!!1 == 1
Y con los dos
!!2==2
!2 -> false
!!2 -> true
(!!2) == 2 -> false
Eso es porque el! el operador tiene prioridad sobre == operador
Consulte Preferencia del operador de Mozilla