Igualdad

Hay cuatro operadores de igualdad: ==, ===, != y !==. Los operadores con el ! son por su supuesto la versiones simétricas de "no igualdad" de sus contra-partes; la no-igualdad no debe confundirse con desigualdad.

La diferencia entre == y === se caracteriza usualmente en que == verifica igualdad y === verifica igualdad de valor y de tipo. Sin embargo esto es inexacto. La manera apropiada de caracterizarlas es que == verifica el valor de igualdad permitiendo coerción, y === verifica la igualdad del valor sin permitir la coerción; por esta razón === a menudo es llamado "igualdad estricta".

Considere la siguiente coercion implicita que esta permetida en la comparacion de igualdad-floja == y no permitida en la igualdad-estricta ===:

var a = "42";
var b = 42;

a == b;         // verdadero
a === b;        // falso

En la comparación a == b, JS sabe que los tipos no coinciden, asi que el atraviesa una serie de pasos para hacer la coercion de uno o ambos valores a un tipo distinto hasta que coincidan.

Si usted lo piensa, hay dos maneras posibles en la que a == b pueda dar verdadero por medio de la coercion. O bien la comparación puede terminar como 42 == 42 o esta podrá ser "42" == "42". Entonces, cual es?

La respuesta: "42" se vuelve 42, para hacer la comparacion 42 == 42. En un ejemplo tan sencillo, en realidad no parece importar de que manera el proceso se ejecuta, ya que el resultado final es el mismo. Hay casos mas complejos donde no tan solo importa cual es el resultado de la comparacion, sino tambien como se obtiene.

a === b produce false, ya que la coercion no esta permitida, asi que la simple comparacion del valor obviamente falla. Muchos desarrolladores sienten que === es mas predecible, por lo siempre recuren a usar este metodo y tienden a alejarse del ==. Pienso que este punto de vista es muy superficial. Creo que == es una herramienta poderosa que ayuda a su programa, si usted toma tiempo para aprender como funciona.

No vamos a cubrir todos los pequeños detalles de como la coercion en comparaciones de igualdad == funciona. Gran parte de ella es muy sensible, ya que hay parte importantes de las que hay que tener cuidado. Usted puede leer la sección 11.9.3 de la especificación ES5 (http://www.ecma-international.org/ecma-262/5.1/) para ver las reglas exactas, y se sorprendera de lo facil que este mecanismo es, comparado a toda la mala vibra que la rodea.

Para reducir un monton de detalles a unas pocas simples reglas, y ayudarlo a saber si usar == o === en diferentes situaciones, aquí estan mis simples reglas:

  • Si algun valor(lado) en una comparacion puede ser un valor true o false evite == y use ===.
  • Si algun valor en una comparacion puede ser uno de estos valores especificos (0, "" o [] -- un arreglo vacio), evite == y use ===.
  • En todos los demas casos, es seguro que use ==. No solo es seguro, sino que en muchos casos simplificara su codigo de una manera en que mejore la legibilidad.

La reducción a estas reglas lo esta obligando a pensar criticamente sobre su codigo y acerca de que tipo de valores pueden provenir de las variables que van a ser comparadas para igualdad. Si usted puede estar seguro de los valores y == es seguro, uselo! Si no esta seguro acerca de los valores, use ===. Asi de simple.

La != no-igualdad forma pareja con ==, y !== forma pareja con ===. Todas las reglas y observaciones que acabamos de discutir tienen las mismos metodos de acción para la comparación de no-igualdad.

Usted deberia tomar con sumo cuidado las reglas de comparacion de == y === si esta comparando dos valores no-primitivos, como objetos (incluidos funciones y arreglos). Ya que estos valores son almacenados por referencia, ambas comparaciones == y === tan solo verificaran si la referencia coinciden, y no verifican valores subyacentes.

Por ejemplo, arrays son por defecto convertidos a cadenas de texto(strings) simplemente uniendo los valores con comas(,). Tal vez piense que dos arrays con el mismo contenido sea == igual, pero no:

var a = [1,2,3];
var b = [1,2,3];
var c = "1,2,3";

a == c;     // true
b == c;     // true
a == b;     // false

Nota: Para mas informacion acerca de las reglas de comparacion de la igualdad ==, revisar la especificacion ES5 (seccion 11.9.3) y tambien consultar el Capitulo 4 de Types & Grammar de esta serie de libros; revisar el Capitulo 2 para mas informacion acerca de valores versus referencias.

results matching ""

    No results matching ""