# Truthy

JavaScript має концепцію "істинності" (`truthy`), тобто речей, які оцінюються як `true` в певних контекстах (наприклад, в умовах оператора `if` та логічних операторах `&&` та `||`). Наступні речі є істинними в JavaScript. Наприклад, будь-яке число, крім `0`, наприклад:

```ts
if (123) { // Will be treated like `true`
  console.log('Any number other than 0 is truthy');
}
```

Те, що не є істиною (truthy), зветься хибним (falsy).

Ось зручна таблиця для вашої довідки:

| Значення                                          | *falsy*             | *truthy*         |
| ------------------------------------------------- | ------------------- | ---------------- |
| `boolean`                                         | `false`             | `true`           |
| `string`                                          | `''` (empty string) | будь-який string |
| `number`                                          | `0` `NaN`           | будь-який number |
| `null`                                            | завжди              | ніколи           |
| `undefined`                                       | завжди              | ніколи           |
| Будь-який Object, в тому числі порожній `{}`,`[]` | ніколи              | завжди           |

<br>

## Бути явним:

> Шаблон !!:

Досить часто буває корисно чітко вказати, що ви хочете розглядати значення як `boolean` і перетворити його в *правильне булеве значення* (одне з `true`|`false`). Ви можете легко перетворити значення на істинний булевий вираз, додавши до нього префікс `!!`, наприклад `!!foo`. Просто `!` використовується *двічі*. Перший `!` перетворює змінну (у цьому випадку `foo`) на булеве значення, але інвертує логіку (*truthy* -`!`> `false`, *falsy* -`!`> `true`). Другий перемикає її знову, щоб відповідати природі початкового об'єкта (наприклад, *truthy* -`!`> `false` -`!`> `true`).

Цей шаблон часто використовується в багатьох місцях, наприклад:

```js
// Direct variables
const hasName = !!name;

// As members of objects
const someObj = {
  hasName: !!name
}

// e.g. in ReactJS JSX
{!!someName && <div>{someName}</div>}
```
