Comparando variables con javascript
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