Tengo un resultado extraño cuando uso !!:

["a"].indexOf("b") === -1 // true
!!(["a"].indexOf("b") === -1) //true
!!["a"].indexOf("b") === -1 // false
!["a"].indexOf("b") === -1 //false

Obviamente, el primer y el segundo resultado son los esperados, pero los otros dos parecen extraños, ¿verdad? Parece que no puedo encontrar una razón por la cual las declaraciones segunda y tercera no son equivalentes, y ciertamente no puedo entender cómo las declaraciones tercera y cuarta pueden tener el mismo valor booleano.

Supuse que !!["a"] se evalúa a true antes de evaluar el resto de la declaración, pero ¿por qué no obtendrías un TypeError para true.indexOf("b")?

Tal vez no entiendo cómo funciona la precedencia del operador, pero me gustaría entender lo que está sucediendo aquí si alguien puede explicarlo.

0
rubie 29 oct. 2017 a las 13:21

3 respuestas

La mejor respuesta

!!["a"].indexOf("b") === -1 // false:

["a"]. indexOf ("b") da -1 entonces !! - 1 da verdadero que no es estrictamente igual a -1 que da falso.

!["a"].indexOf("b") === -1 //false:

["a"]. indexOf ("b") da -1, entonces! -1 da falso que no es estrictamente igual a -1 que da falso.

Vale la pena señalar aquí que en el contexto numérico, utilizado en estas comparaciones (y en general, excepto que compara dos cadenas), verdadero es 1 y falso es 0. Entonces, incluso == daría dos falsos.

Otra pregunta es precedencia:

  1. llamada a función (["a"]. indexOf ("b"))
  2. lógico NO (!)
  3. igualdad estricta (===)
1
curveball 29 oct. 2017 a las 11:10

Debería haber verificado la precedencia del operador Javascript, como se puede encontrar aquí:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table

Muestra que el NOT lógico (!) tiene mayor prioridad que el operador de igualdad de script (===).

Así que:

!!["a"].indexOf("b") === -1

Evalúa como:

(!!["a"].indexOf("b")) === -1

Lo que significa (!!-1) === -1 que obviamente es falso ya que !!-1 es true.

1
jcaron 29 oct. 2017 a las 10:50

Esto se evalúa en el siguiente orden:

"a" // -> "a"
["a"] // -> ["a"]
["a"].indexOf("b") // -> -1
!!["a"].indexOf("b") // -> true
!!["a"].indexOf("b") === -1 // -> false

Entonces el punto es que . evalúa antes que !.

0
Lux 29 oct. 2017 a las 10:41