# Examples

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

```javascript
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. Во всех других случаях, операнды **неравны.**

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

```javascript
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(),*** то он вызываетс&#x44F;***.*** Если вызов метода возвращает примитив, объект приводится к значению этого примитива.
2. В противном случае, если у объекта есть метод ***toString(),*** то он вызываетс&#x44F;***.*** Если вызов метода возвращает примитив, объект приводится к значению этого примитива.
3. В противном случае будет ошибка: **TypeError: Cannot convert object to primitive value.**

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

1. Если операнды имеют одинаковый тип, они проверяются правилами строгого сравнения.
2. Если операнды имеют разные типы:
   1. Если один из операндов **null** а другой **undefined,** они **равны**.
   2. Если один из операндов ***число*** и другой ***строка***, строка приводится к ***числу*** и операнды сравниваются заново.
   3. Если один из операндов логический тип (boolean), он преобразуется к **1** или **0** - в случае **true** и **false** соответственно, операнды сравниваются заново.
   4. Если один из операндов **объект** и другой **строка** или **число,** объект приводится к примитиву. Операнды сравниваются заново.
3. Во всех других случаях операнды неравны.

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

```javascript
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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://andersenlab.gitbook.io/javascript/js-basics/equality/examples.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
