Comparando variables con javascript

De ChuWiki
Saltar a: navegación, buscar

Javascript intenta siempre convertir las variables al tipo adecuado para poder trabajar con ellas. Veamos varios casos


En un if

Si ponemos if(variable) pueden pasar muchas cosas según el tipo de la variable. En principio javascript trata de hacer lo más lógico.

  • if (undefined) es false
  • if (variable) da error si variable no está definida.
  • if (null) es false
  • if (variable) es false si variable es null
  • if ("") es false
  • if ("cadena rellena") es true
  • if (0) es false
  • if (NaN) es false
  • if (22) es true (cualquier número es true salvo 0, -0 o NaN
  • if ({}) es true, cualquier objeto no null es true.


En un ==

En un ==, si las dos variables no son del mismo tipo, intenta convertirlas a enteros para hacer la comparación.

Los string se convierten al entero correspondiente, a NaN si no se pueden convertir a entero y es una excepción "" que se convierte en 0.

  • "0"==0 es true, el "0" se convierte a 0
  • "1"==1 es true, el "1" se convierte a 1
  • "true"==true es false, el "true" se convierte en NaN
  • "false"==false es false, el "false" se convierte a NaN
  • ""==false es true, ambos se convierten a 0
  • "1"==true es true, ambos se convierten en 1

los booleanos, false se convierte en 0 y true en 1.

  • false==0 es true, el false se convierte a 0
  • true==1 es true, el true se convierte a 1
  • true==2 es false, el true se convierte a 1

null solo es igual a si mismo o undefined

  • null==null es true
  • null==undefined es true
  • null=="" es false
  • null==0 es false
  • null==false es false
  • null==true es false

undefined es igual a si mismo o null

  • undefined ==null es true
  • undefined ==undefined es true
  • undefined =="" es false
  • undefined ==0 es false
  • undefined ==false es false
  • undefined ==true es false

Un caso particular es NaN que siempre es distinto a todo, incluso a sí mismo

  • NaN==NaN es false

Para saber si un numero es NaN, debemos usar la función isNaN() que devuelve true si se le pasa NaN como parámetro o alque que al convertirse a entero de NaN

  • isNaN(NaN) es true
  • isNaN("aaa") es true, "aaa" no se puede convertir a entero


Los objetos y arrays siempre son distintos si son instancias distintas, aunque tengan los mismos elementos dentro.

  • {}=={} es false
  • []==[] es false
  • ({key:"clave"}=={key:"clave"}) es false
  • [1,2,3]==[1,2,3] es false

Comparación estricta con ===

Podemos evitar las conversiones implicitas al comparar si hacemos la comparación con tres símbolos =. Al no haber conversiones, obtendremos false siempre que los tipos sean distintos y solo obtendremos true si además de ser el mismo tipo, son iguales

Todos los ejemplos anteriores darían false, al ser tipos distintos. Ponemos solo algunos ejemplos

  • "0"===0 es false
  • ""===false es false
  • false===0 es false
  • null===undefined es false