Boolean

Значення Boolean (булеві) можуть мати одне з двох значень: true (істина) або false (хиба), що представляють значення істинності логічного твердження.

Опис

Значення Boolean зазвичай повертаються операторами відношення, операторами рівності та логічним НЕ (!). Також вони можуть повертатися функціями, що представляють умови, наприклад, Array.isArray(). Зверніть увагу на те, що бінарні логічні оператори, серед яких && і ||, повертають значення операндів, що можуть бути булевими значеннями, але можуть і не бути.

Булеві значення здебільшого використовуються в перевірці умов, наприклад, умовах інструкцій if...else і while, умовному операторі (? :) та поверненому значенні предиката Array.prototype.filter().

Рідко трапляється необхідність явно перетворювати щось на булеве значення, адже JavaScript у булевих контекстах робить це автоматично, тож можна користуватися будь-яким значенням так, ніби воно булеве, послуговуючись його істинністю. Також заохочується використання у власному коді if (condition) і if (!condition) замість if (condition === true) і if (condition === false), щоб послуговуватися користю від такої поведінки. Однак пересвідчення в тому, що значення умов завжди є булевими, допоможе краще роз'яснити призначення коду.

// Робіть так:
// Це завжди повертає булеве значення
const isObject = (obj) => !!obj && typeof obj === "object";

// Або так:
const isObject = (obj) => Boolean(obj) && typeof obj === "object";

// Або так:
const isObject = (obj) => obj !== null && typeof obj === "object";

// А не так:
// Це може повернути хибні значення, що не дорівнюють false
const isObject = (obj) => obj && typeof obj === "object";

Булеві примітиви та об'єкти Boolean

Для перетворення небулевих значень на булеві слід користуватися Boolean як функцією або оператором подвійного НЕ. Не слід використовувати конструктор Boolean() з new.

const good = Boolean(expression);
const good2 = !!expression;
const bad = new Boolean(expression); // не користуйтеся цим!

Це пов'язано з тим, що всі об'єкти, включно з об'єктом Boolean, у який загорнуто значення false, є істинними і в умовних інструкціях обчислюються як true. (Див. також розділ зведення до булевого нижче.)

if (new Boolean(true)) {
  console.log("Це виведення – друкується.");
}

if (new Boolean(false)) {
  console.log("Це виведення – ТАКОЖ друкується.");
}

const myFalse = new Boolean(false); // myFalse – це об'єкт Boolean (а не примітивне значення false)
const g = Boolean(myFalse); // g дорівнює true
const myString = new String("Привіт"); // myString – це об'єкт String
const s = Boolean(myString); // s дорівнює true

[!WARNING] Використовувати Boolean як конструктор повинно доводитись нечасто.

Зведення до булевого

Чимало вбудованих операцій, що очікують на булеві значення, зводять свої аргументи до булевих. Ця операція може бути підсумована отак:

  • Булеві значення повертаються як є.
  • undefined стає false.
  • null стає false.
  • 0, -0 і NaN стають false, а решта чисел – true.
  • 0n стає false, а решта значень BigInttrue.
  • Порожній рядок "" стає false, а інші рядки – true.
  • Символи стають true.
  • Усі об'єкти – стають true.

[!NOTE] Історична логіка змушує document.all повертати false, коли вживається як булеве значення, всупереч тому, що це об'єкт. Ця властивість є історичною та нестандартною, її не варто використовувати.

[!NOTE] На відміну від інших перетворень типів, як то зведення до рядка чи зведення до числа, зведення до булевого не намагається перетворювати об'єкти на примітиви шляхом виклику користувацьких методів.

Інакше кажучи, є вельми невелика кількість значень, що зводяться до false, — вони звуться хибними значеннями. Всі решта – звуться істинними значеннями. Істинність значення – важлива, коли воно використовується з логічними операторами, умовними інструкціями або будь-яким булевим контекстом.

Є два способи досягнути в JavaScript такого ж ефекту.

  • Подвійне НЕ: !!x двічі заперечує x, що перетворює x на булеве значення, використовуючи той же алгоритм, що описано вище.
  • Функція Boolean(): Boolean(x) використовує для перетворення x той же алгоритм, описаний вище.

Зверніть увагу на те, що істинність – не те саме, що нестрога рівність щодо true або false.

if ([]) {
  console.log("[] – істинне значення");
}
if ([] == false) {
  console.log("[] == false");
}
// [] – істинне значення
// [] == false

[] – істинне значення, але також воно нестрого рівно false. Воно істинне, тому що всі об'єкти – істинні. Проте як порівняти з false, що є примітивом, [] також перетворюється на примітив, тобто на "" – за допомогою Array.prototype.toString(). Порівняння рядків і булевих значень призводить до того, що обидві сторони перетворюються на числа, і обидва ці значення стають 0, тож [] == false обчислюється як true. Загалом, хибність і == false – відрізняються у наступних випадках:

  • NaN, undefined і null – хибні, але нестрого не дорівнюють false.
  • "0" (та інші рядкові літерали, окрім "", що зводяться до 0), – істинні, але нестрого рівні false.
  • Об'єкти – завжди істинні, але їхнє примітивне представлення може нестрого дорівнювати false.

Істинні значення мають навіть меншу ймовірність нестрого дорівнювати true. Усі значення є або істинними, або хибними, але більшість значень не є нестрого рівними ані true, ані false.

Конструктор

Boolean()

Створює об'єкти Boolean. Якщо викликається як функція, повертає примітивні значення типу Boolean.

Властивості примірника

Ці властивості означені на Boolean.prototype і є спільними для всіх примірників Boolean.

Boolean.prototype.constructor

Функція-конструктор, що створила об'єкт-примірник. Для примірників Boolean початковим значенням є конструктор Boolean.

Методи примірника

Boolean.prototype.toString()

Повертає рядок – або true, або false, залежно від значення об'єкта. Заміщує метод Object.prototype.toString().

Boolean.prototype.valueOf()

Повертає примітивне значення об'єкта Boolean. Заміщує метод Object.prototype.valueOf().

Приклади

Створення хибних значень

const bNoParam = Boolean();
const bZero = Boolean(0);
const bNull = Boolean(null);
const bEmptyString = Boolean("");
const bfalse = Boolean(false);

Створення істинних значень

const btrue = Boolean(true);
const btrueString = Boolean("true");
const bfalseString = Boolean("false");
const bSuLin = Boolean("Su Lin");
const bArrayProto = Boolean([]);
const bObjProto = Boolean({});

Специфікації

Сумісність із браузерами

desktop mobile server
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
Boolean
Chrome Full support 1
Edge Full support 12
Firefox Full support 1
Internet Explorer Full support 3
Opera Full support 3
Safari Full support 1
WebView Android Full support 1
Chrome Android Full support 18
Firefox for Android Full support 4
Opera Android Full support 10.1
Safari on iOS Full support 1
Samsung Internet Full support 1.0
Deno Full support 1.0
Node.js Full support 0.10.0
Boolean() constructor Chrome Full support 1
Edge Full support 12
Firefox Full support 1
Internet Explorer Full support 3
Opera Full support 4
Safari Full support 1
WebView Android Full support 1
Chrome Android Full support 18
Firefox for Android Full support 4
Opera Android Full support 10.1
Safari on iOS Full support 1
Samsung Internet Full support 1.0
Deno Full support 1.0
Node.js Full support 0.10.0
toSource
Нестандартне
Chrome No support Ні
Edge No support Ні
Firefox No support 1 –  74
footnote
Internet Explorer No support Ні
Opera No support Ні
Safari No support Ні
WebView Android No support Ні
Chrome Android No support Ні
Firefox for Android Full support 4
Opera Android No support Ні
Safari on iOS No support Ні
Samsung Internet No support Ні
Deno No support Ні
Node.js No support Ні
toString Chrome Full support 1
Edge Full support 12
Firefox Full support 1
Internet Explorer Full support 3
Opera Full support 4
Safari Full support 1
WebView Android Full support 1
Chrome Android Full support 18
Firefox for Android Full support 4
Opera Android Full support 10.1
Safari on iOS Full support 1
Samsung Internet Full support 1.0
Deno Full support 1.0
Node.js Full support 0.10.0
valueOf Chrome Full support 1
Edge Full support 12
Firefox Full support 1
Internet Explorer Full support 4
Opera Full support 4
Safari Full support 1
WebView Android Full support 1
Chrome Android Full support 18
Firefox for Android Full support 4
Opera Android Full support 10.1
Safari on iOS Full support 1
Samsung Internet Full support 1.0
Deno Full support 1.0
Node.js Full support 0.10.0

Дивіться також