Object.is() pero, ¿qué es?

Estela Parrado
2 min readMay 23, 2018

--

Lamentablemente no se nace sabiendo código (ojalá) y la única manera de llegar a comprender todas sus particularidades es la práctica. Es por esto que las katas -una especie de entrenamiento de código basado en ejercicios cortos que te ayudan a adquirir nuevos conocimientos- nos hacen el aprendizaje más ameno. Y, además, pueden encontrarse comportamientos curiosos.

Realizando algunas de estas katas de ES6, me encontré con el método Object.is().

Object.is()

Se trata de un método al que le pasamos dos valores y nos devuelve un Boolean, es decir un true o un false, determinando si estos dos valores son iguales.

Hasta aquí Object.is() no tiene nada de curioso, es un método para comparar valores y para eso ya tenemos nuestros comparadores == e ===.

Vamos a ver algunos ejemplos (puedes pegarlos en la consola):

//Comparando número con número
Object.is(1, 1);
→ true
//Comparando número con string
Object.is(‘1’, 1);
→ false
//Comparando string con string
Object.is('hola', 'hol');
→ false
//Comparando +0 y -0
Object.is(-0, +0);
→ false
//Comparando NaN con NaN
Object.is(NaN, NaN);
→ true

De los tres ejemplos anteriores podemos extraer varias conclusiones sobre lo que Object.is NO es:

  • Comparador ==, ya que no hace la conversión de tipo para comparar valores en el ejemplo del número con el string.
  • Comparador ===, ya que al comparar NaN con NaN obtenemos un true (explosión mental, porque aquí hablamos de la soledad del valor NaN).

Entonces, ¿qué es? Hasta donde he investigado, Object.is tiene algunos comportamientos semejantes al typeof, pero también tiene otros parecidos al comparador de estricta igualdad. Compara el valor, pero lo primero que hace es fijarse en el tipo de datos que está comparando.

El proceso interno de Object.is()

Como decía, lo primero que hace Object.is() es comparar el tipo de datos que le están pasando siguiendo este proceso:

Vamos a suponer Object.is(x, y)
1. typeof(x) !== typeof(y) →false

2. typeof(x) es un número:
Si typeof(x) e typeof(y) son NaN → true
Si typeof(x) es -0 e typeof(y)+0 → false (y viceversa para +0 y -0)
→ Si el valor de x es el mismo que y → true (si no lo son, false)

3. typeof(x) NO es un número:
→Si typeof(x) es undefinedtrue
→ Si typeof(x) es null true
→ Si typeof(x) y typeof(y) son strings y tienen los mismo caracterestrue
→ Si typeof(x) y typeof(y) son ambos true, o ambos falsetrue

Así que, para concluir, podemos pensar en Object.is() como un comparador de estricta igualdad con los casos excepcionales de NaN y (-0,+0).

--

--

Estela Parrado

Front-end Developer y Diseñadora Gráfica. #Adalaber #GeneracionK en @kairos_ds