Examples
Какое значение будет в консоли и почему ?
var equalityResult = {} == true;
console.log(equalityResult)Необходимо не только ответить на вопрос, но и дать исчерпывающее объяснение процессу сравнения двух операндов, в данном случае объекта { } и true .
Начнем с того, что для сравнения в Javascript существует 2 типа операторов сравнения: строгий (==) и нестрогий (===). В случае строго сравнения, ввиду разных типов операндов, очевиден ответ false. Для каждого типа сравнения есть свой набор правил.
Для строгого сравнения (===):
- Если оба операнда разного типа, они неравны. 
- Если оба операнда null, они равны. 
- Если оба операнда undefined, они равны. 
- Если оба или один из операторов NaN, они неравны. 
- Если оба операнда true или false, они равны. 
- Если оба операнда типа number и имеют одинаковое значение, то они равны. 
- Если оба операнда типа string и имеют одинаковое значение, то они равны. 
- Если оба операнда имеют ссылку на один и тот же объект, то они равны. 
- Во всех других случаях, операнды неравны. 
Несколько примеров:
1 === "1" // false, правило 1
0 === 0 // true, правило 6  
undefined === undefined // true, правило 3  
undefined === null // false, правило 1  
NaN === NaN // false, правило 4  
var firstObject = {},  
var secondObject = firstObject;
secondObject['name'] = 'Neo';  
secondObject === firstObject // true, правило 8 
[] === [] //false, правило 9При нестрогом сравнении, зачастую один или оба операнда приводятся к какому-нибудь примитивному типу. Для последующего разбора нестрогого сравнения, необходимо рассмотреть приведение объекта к примитивному значению:
- Если у объекта существует метод valueOf(), то он вызывается. Если вызов метода возвращает примитив, объект приводится к значению этого примитива. 
- В противном случае, если у объекта есть метод toString(), то он вызывается. Если вызов метода возвращает примитив, объект приводится к значению этого примитива. 
- В противном случае будет ошибка: TypeError: Cannot convert object to primitive value. 
Для нестрогого сравнения:
- Если операнды имеют одинаковый тип, они проверяются правилами строгого сравнения. 
- Если операнды имеют разные типы: - Если один из операндов null а другой undefined, они равны. 
- Если один из операндов число и другой строка, строка приводится к числу и операнды сравниваются заново. 
- Если один из операндов логический тип (boolean), он преобразуется к 1 или 0 - в случае true и false соответственно, операнды сравниваются заново. 
- Если один из операндов объект и другой строка или число, объект приводится к примитиву. Операнды сравниваются заново. 
 
- Во всех других случаях операнды неравны. 
Несколько примеров:
1 == true // true  
'' == 0 // true  
null == 0 // false 
null == undefined // true  
NaN == NaN // false  
[''] == '' // true
{} == true // falseТаким образом, выражение {} == true будет равно false:
- { } == 1 
- "[object Object]" == 1 
- NaN == 1 
- NaN === 1 
- false 
Last updated
