Examples

Какое значение будет в консоли и почему ?

var equalityResult = {} == true;

console.log(equalityResult)

Необходимо не только ответить на вопрос, но и дать исчерпывающее объяснение процессу сравнения двух операндов, в данном случае объекта { } и true .

Начнем с того, что для сравнения в Javascript существует 2 типа операторов сравнения: строгий (==) и нестрогий (===). В случае строго сравнения, ввиду разных типов операндов, очевиден ответ false. Для каждого типа сравнения есть свой набор правил.

Для строгого сравнения (===):

  1. Если оба операнда разного типа, они неравны.

  2. Если оба операнда null, они равны.

  3. Если оба операнда undefined, они равны.

  4. Если оба или один из операторов NaN, они неравны.

  5. Если оба операнда true или false, они равны.

  6. Если оба операнда типа number и имеют одинаковое значение, то они равны.

  7. Если оба операнда типа string и имеют одинаковое значение, то они равны.

  8. Если оба операнда имеют ссылку на один и тот же объект, то они равны.

  9. Во всех других случаях, операнды неравны.

Несколько примеров:

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

При нестрогом сравнении, зачастую один или оба операнда приводятся к какому-нибудь примитивному типу. Для последующего разбора нестрогого сравнения, необходимо рассмотреть приведение объекта к примитивному значению:

  1. Если у объекта существует метод valueOf(), то он вызывается. Если вызов метода возвращает примитив, объект приводится к значению этого примитива.

  2. В противном случае, если у объекта есть метод toString(), то он вызывается. Если вызов метода возвращает примитив, объект приводится к значению этого примитива.

  3. В противном случае будет ошибка: TypeError: Cannot convert object to primitive value.

Для нестрогого сравнения:

  1. Если операнды имеют одинаковый тип, они проверяются правилами строгого сравнения.

  2. Если операнды имеют разные типы:

    1. Если один из операндов null а другой undefined, они равны.

    2. Если один из операндов число и другой строка, строка приводится к числу и операнды сравниваются заново.

    3. Если один из операндов логический тип (boolean), он преобразуется к 1 или 0 - в случае true и false соответственно, операнды сравниваются заново.

    4. Если один из операндов объект и другой строка или число, объект приводится к примитиву. Операнды сравниваются заново.

  3. Во всех других случаях операнды неравны.

Несколько примеров:

1 == true // true  

'' == 0 // true  

null == 0 // false 

null == undefined // true  

NaN == NaN // false  

[''] == '' // true

{} == true // false

Таким образом, выражение {} == true будет равно false:

  1. { } == 1

  2. "[object Object]" == 1

  3. NaN == 1

  4. NaN === 1

  5. false

Last updated