> For the complete documentation index, see [llms.txt](https://artfulbits-se.gitbook.io/typescript/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://artfulbits-se.gitbook.io/typescript/recap/equality.md).

# Equality

### Порівняння

Одна річ, на яку потрібно звернути увагу в JavaScript, це різниця між `==` та `===`. Оскільки JavaScript намагається бути стійким до помилок програмування, `==` намагається автоматично конвертувати типи між двома змінними, наприклад, конвертує рядок в число, щоб ви могли порівняти з числом, як показано нижче:

```js
console.log(5 == "5"); // true   , TS Error
console.log(5 === "5"); // false , TS Error
```

Однак, вибір, який робить JavaScript, не завжди є ідеальним. Наприклад, у наведеному нижче прикладі перше твердження є хибним, оскільки `""` та `"0"` - це обидва рядки (string) і, очевидно, не є рівними. Однак у другому випадку як `0`, так і пустий рядок (`""`) є ложними значеннями (тобто поводяться як `false`) і, отже, вони рівні з точки зору `==`. У обох випадках твердження є хибними, коли використовується `===`.

```js
console.log("" == "0"); // false
console.log(0 == ""); // true

console.log("" === "0"); // false
console.log(0 === ""); // false
```

> Зауважте, що `string == number` та `string === number` обидва є помилками на етапі компіляції в TypeScript, тому зазвичай вам не потрібно хвилюватися про це.

Аналогічно до `==` проти `===`, існує також `!=` проти `!==`.

Тому порада: завжди використовуйте `===` і `!==`, за винятком перевірок на значення null, про які ми розповімо пізніше.

### Структурне порівняння

Якщо ви хочете порівняти два об'єкти на структурну рівність, оператори `==`/`===` ***не є достатніми***. Наприклад:

```js
console.log({a:123} == {a:123}); // False
console.log({a:123} === {a:123}); // False
```

Для здійснення таких перевірок використовуйте пакет npm [deep-equal](https://www.npmjs.com/package/deep-equal), наприклад:

```js
import * as deepEqual from "deep-equal";

console.log(deepEqual({a:123},{a:123})); // True
```

Однак, досить часто вам не потрібно глибоке порівняння, і все, що вам дійсно потрібно, - це перевірка за допомогою якогось `id`, наприклад:

```ts
type IdDisplay = {
  id: string,
  display: string
}
const list: IdDisplay[] = [
  {
    id: 'foo',
    display: 'Foo Select'
  },
  {
    id: 'bar',
    display: 'Bar Select'
  },
]

const fooIndex = list.map(i => i.id).indexOf('foo');
console.log(fooIndex); // 0
```
