Comparando variables con javascript

De ChuWiki

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


En un if[editar]

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 ==[editar]

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 ===[editar]

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