universo son sol ser reconocer que porque por pone nuestras modelo las importantes importante importancia ideado humano emociones copérnico controlar conocer como centro javascript

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) es Boolean , devuelva el resultado de la comparación ToNumber(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) es Number y Type(y) is String , devuelve el resultado de la comparación x == 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