Операторы проверки на равенства
==
Оператор == проверяет равенство двух значений, при этом приводя к одному типу Number.
'0' == 0 // true
'' == 0 // true
'1' == 1 //true
//нужно запомнить что null и undefined равны между собой, и не равны ни кому другому
false == 0 //true
true == 1 //true
для примведения к числу - сначало используется метод valueOf() если его нет или он вернул не примитив, используется метод toString()
===
Оператор === проверяет равенство значений без приведения
'0' === 0 //false
'1' === 1 //false
[] === [] //false
{} === {} //false
Object.is(val1, val2)
Object.is() - это метод добавленный в ES6. Он проверяет являются ли два значения одинаковыми. Два значения являются одинаковыми если :
- оба равны 
undefined - оба равны 
null - оба 
true, иои обаfalse - две строки равны, если имеют одинаковую длину и одинаковые символы
 два числа равны, если:
- оба 0
 - оба -0
 - оба NaN
 - либо оба не равны нулю или NaN и оба имеют одинаковыет значения
 
оба являются одиним и тем же объектом
Object.is отличается от == тем что оператор == сначало приводит оба значения к одному типу. В результате '' == false - вернет true, или '0' == 0 и '' == 0 в обоих случаях вернет true. Object.is - не приводит значения к одному виду.
Так же Object.is не тоже самое что и ===. Т.к например +0 и -0  равны, а NaN между собой неравны.
Object.is(NaN, NaN) // true
Object.is([], []) //false
Object.is('0', 0) //false
Object.is(null, undefined) //fasle