Странности равенства
Задача
Что выведет каждое сравнение и почему?
NaN === NaN; // ?
Object.is(NaN, NaN); // ?
0 === -0; // ?
Object.is(0, -0); // ?
null == undefined; // ?
null === undefined; // ?
'' == 0; // ?
'' == false; // ?
[] == false; // ?
[] == ![]; // ?
null >= 0; // ?
null > 0; // ?
null == 0; // ?Ответ
false // NaN === NaN true // Object.is(NaN, NaN) true // 0 === -0 false // Object.is(0, -0) true // null == undefined false // null === undefined true // '' == 0 true // '' == false true // [] == false true // [] == ![] true // null >= 0 false // null > 0 false // null == 0
Разбор
Пошаговый разбор
Сравнение Что происходит Результат NaN === NaNNaNне равен ничему, даже себеfalseObject.is(NaN, NaN)Object.isсчитаетNaNравнымNaNtrue0 === -0===не различает знак нуляtrueObject.is(0, -0)Object.isразличает+0и-0falsenull == undefinedпо спецификации равны только друг другу truenull === undefinedразные типы false'' == 0''→0,0 == 0true'' == falsefalse→0,''→0true[] == falsefalse→0,[]→''→0true[] == ![]![]→false→0;[]→''→0truenull >= 0операторы сравнения приводят к числу: null→0,0 >= 0truenull > 0null→0,0 > 0falsenull == 0у ==дляnullспец-правило: равен толькоundefined, к числу НЕ приводитсяfalse
Ключевые правила
===отличается отObject.isровно в двух случаях:NaNи±0.nullиundefinedпри==равны друг другу и больше ничему; при этом==дляnullне приводит к числу.- А вот операторы
<,>,>=,<=приводятnullк0— отсюда парадокс:null >= 0истина, ноnull == 0ложь.- Чтобы не держать всё это в голове: используйте
===иObject.is, избегайте==.