Як перевірити, чи є тип булевим


269

Як я можу перевірити, чи є тип змінної булевим?

Я маю на увазі, є деякі альтернативи, такі як:

if(jQuery.type(new Boolean()) === jQuery.type(variable))
      //Do something..

Але це мені не здається гарним.

Чи є більш чистий спосіб досягти цього?


1
Не є trueчи falseтипу булевого типу?
Матіас Цицерон

1
Вам не потрібно перевіряти, ви можете це зробити, !!( ... some expression ...)і результат буде бурхливим.
Каллум Лінінгтон

1
Ні: trueі falseпримітиви типу boolean. Булевий тип "капітал Б" - тип обгортки об'єктів для булових примітивів.
Pointy

@CallumLinington, які не працюватимуть для об’єктів, створених за допомогою булевого конструктора :)
Pointy

1
@CallumLinington спробуйте: if (new Boolean(false)) alert("hi");- Булевий об'єкт з великим капіталом B завжди є "truthy", незалежно від нижнього булевого значення little-b.
Pointy

Відповіді:


506

Ось для чого typeofце. Дужки не є обов'язковими, оскільки це оператор .

if (typeof variable === "boolean"){
  // variable is a boolean
}

7
Не ясно, що ОП намагається зробити, але булеві об'єкти з великим капіталом B дають "об'єкт" як їх тип через typeof.
Pointy

14
1) typeofне є функцією. 2) Використовувати потрійний оператор === з typeofне потрібно, оскільки він буде повертати завжди рядок (afaik, але, наскільки я пам’ятаю, був інший випадок для деяких дуже старих браузерів). 3) typeofі порівняння струн відбувається повільно. Не використовуйте їх. Перевірте безпосередньо с (variable === true || variable === false)(я пропоную написати функцію).
StanE

6
не typeof(variable) === typeof(true)було б більш надійним?
Маркус Юній Брут

2
@TusharNiras nameє глобальним властивістю вікна зі спеціальним гетерні developer.mozilla.org/en-US/docs/Web/API/Window/name
Zach Lysobey

1
@MarcusJuniusBrutus @AmitJoki - це нісенітниця, немає переваги у використанні більше багатослівних typeof trueзамість "boolean". Нові версії ECMAScript ніколи не матимуть порушень.
m93a

40

Якщо ви просто хочете перевірити наявність примітивного значення

typeof variable === 'boolean'

Якщо з якоїсь дивної причини у вас є булеви, створені за допомогою конструктора, це насправді не булеві, а об'єкти, що містять примітивне булеве значення, і один із способів перевірити як примітивні булеві, так і об’єкти, створені за допомогою new Boolean:

function checkBool(bool) {
    return typeof bool === 'boolean' || 
           (typeof bool === 'object' && 
            bool !== null            &&
           typeof bool.valueOf() === 'boolean');
}


2
Мені не здається дуже практичним трактувати булеві примітиви та булеві об'єкти як однакові, тому що я не можу їх використовувати однаково.
Фелікс Клінг

@FelixKling - мені також не здається дуже практичним, але здається, що ОП намагається визначити, чи є змінна булева, навіть коли створена з new Boolean(), яка технічно не булева, а об'єктна, але все-таки має місце булеве значення.
аденео

Я думаю, що ОП просто не знала, що new Boolean()повертає об'єкт (див. Коментарі до питання). Але як би там не було :)
Фелікс Клінг

@FelixKling - Просто перечитайте запитання та коментарі, і я бачу зараз, що ОП в основному намагається зробити typeof variable === typeof new Boolean()і, ймовірно, просто хочуть регулярну перевірку typeof, але якимось чином потрапив у якийсь дивний синтаксис jQuery.
аденео

В залежності від того, як пружними ви хочете зробити свій код, якщо boolпари проходили в були б ще оцінити і виключення буде кинуто на виклик . Таким чином, я змінив би останній рядок на читання: який буде оцінюватися лише тоді, коли він не є нульовим. nulltypeof bool === 'object'TypeError: Cannot read property 'valueOf' of nulltypeof bool.valueOf()(typeof bool === 'object' && bool && typeof bool.valueOf() === 'boolean');bool
Аль-Дасс

34

За допомогою чистого JavaScript ви можете просто використовувати typeofта робити щось на кшталт typeof falseабо, typeof trueі воно повернеться "boolean"...

Але це не єдиний спосіб зробити це, я створюю функції нижче, щоб показати різні способи перевірки Boolean в JavaScript, а також різні способи, як це можна зробити в деяких нових рамках, почнемо з цього:

function isBoolean(val) {
   return val === false || val === true;
}

Або однолінійний спосіб ES6 ...

const isBoolean = val => 'boolean' === typeof val;

і називайте це так!

isBoolean(false); //return true

Також у вихідному коді підкреслення вони перевіряють його так (з _. На початку назви функції):

isBoolean = function(obj) {
   return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
};

Також у jQuery ви можете перевірити це так:

jQuery.type(true); //return "boolean"

У React , якщо ви використовуєте propTypes, ви можете перевірити значення булевим таким чином:

MyComponent.propTypes = {
  children: PropTypes.bool.isRequired
};

Якщо ви використовуєте TypeScript , ви також можете використовувати тип boolean :

let isDone: boolean = false;

Також інший спосіб зробити це - це як перетворити значення на булеве і побачити, чи все-таки це все одно, щось на кшталт:

const isBoolean = val => !!val === val;

або як:

const isBoolean = val => Boolean(val) === val;

і зателефонуйте!

isBoolean(false); //return true

Для цього не рекомендується використовувати будь-які рамки, оскільки це справді проста перевірка JavaScript.


Не згоден: new Boolean(true) === new Boolean(true)повинен повертати помилково (оскільки посилання різні). Ось чому isBoolean(new Boolean(true))заповіт скажеться хибним, хоча він повинен бути істинним ( булевийnew Boolean(true) тип ).
AlexMelw

17

Існує три "ванільні" способи перевірити це за допомогою або без jQuery.

  1. Спочатку потрібно змусити булеву оцінку за допомогою примусу, а потім перевірити, чи вона дорівнює початковій величині:

    function isBoolean( n ) {
        return !!n === n;
    }
  2. Проста typeofперевірка:

    function isBoolean( n ) {
        return typeof n === 'boolean';
    }
  3. Здійснення повністю зайвого набору та непотрібної інстанції обгортки класу на первісному:

    function isBoolean( n ) {
        return n instanceof Boolean;
    }

Третій повернеться лише у тому true випадку, якщо ви створите new Booleanклас та передасте його.

Для розробки примусу примітивів (як показано на №1) усі типи примітивів можна перевірити таким чином:

  • Boolean:

    function isBoolean( n ) {
        return !!n === n;
    }
  • Number:

    function isNumber( n ) {
        return +n === n;
    }
  • String:

    function isString( n ) {
        return ''+n === n;
    }

Чому коерсіон типу "найоптимальніший"? Це швидше чи читабельніше, ніж typeof? Я дуже сумніваюся в цьому.
m93a

Отже, теоретично, примушення значення до булевого значення робить 1 примус + 2 порівняння + 1 порівняння. Перші два порівняння відбуваються під час кроків примусу, а останнє порівняння - проти першої позиції (яка зараз є примітивною). Здійснення typeofтакож є 1 примусом, але typeofметод робить кілька зібрань та порівнянь всередині + 1 порівняння в самому кінці. Ось посилання V8 наtypeof
iSkore

1
Зрештою, будь-який метод настільки проклятий швидко, різниця в наносекундах настільки мала, що важко було б навіть перевірити, який був швидший. Ось два JSPerf. Один каже !!швидше, хтось каже Booleanшвидше. Просто посилання на те, наскільки дельта між тестами. Булеві перевірки швидкі. jsperf.com/bool-not-not jsperf.com/bool-vs-doublenot
iSkore

Я погоджуюся з тим, що різниця не піддається вимірюванню, і в такому випадку реадабілідія повинна завжди АФАІК бути першою. Таким чином, стандартний і зрозумілий typeof val === "boolean"є оптимальним.
m93a

1
Так, я згоден з цим. Читання є важливим. Оператори не такі
читальні

16

Для цього можна використовувати чистий Javascript:

var test = true;
if (typeof test === 'boolean')
   console.log('test is a boolean!');

7

Якщо ви хочете, щоб ваша функція також могла перевірити булі об'єкти, найефективнішим рішенням повинно бути:

function isBoolean(val) {
  return val === false || val === true || val instanceof Boolean;
}

instanceof Boolean для мене не оголошено.
Дуді

3

Найнадійніший спосіб перевірити тип змінної в JavaScript є наступне :

var toType = function(obj) {
  return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}
toType(new Boolean(true)) // returns "boolean"
toType(true); // returns "boolean"

Причиною цього ускладнення є те, що typeof trueповертається, "boolean"а typeof new Boolean(true)повертається "object".


Чому б ви хотіли повернути, "boolean"якщо значення дійсно є об’єктом? Це не здається мені дуже практичним. Булеві об'єкти так чи інакше доводиться розглядати, ніж булеві примітиви.
Фелікс Клінг

1
Код не чистий, гарний чи чіткий. Зауважте, що ОП просить "чистішого способу досягти цього".
Spencer Wieczorek

Я погоджуюся, що код не чистий чи гарний, але AFAIK не існує гарного та водночас надійного варіанту у випадку, якщо на місці події як булеві примітиви, так і булеві об'єкти.
Володимир Фролов

Це здається серйозним рішенням про надмірний рівень, щоб зробити щось, що можна зробити на самому місці.
фірмовий сценарій

3

Я б пішов з Лодашем: isBoolean перевіряє, чи є передана змінна або примітивним булевим, або булевим об'єктом обгортки, і тому обліковує всі випадки.


1

Ви можете створити функцію, яка перевіряє typeofаргумент.

function isBoolean(value) {
  return typeof value === "boolean";
}

1

Іноді нам потрібен єдиний спосіб перевірити це. typeof не працює на дату і т. д. Тож я полегшив її

Date.prototype.getType() { return "date"; }

Крім того, для Number, String, і Booleanт.д. , ми часто повинні перевірити тип в одному шляху ...


1

Створення таких функцій, як те, isBooleanщо містить oneliner, typeof v === "boolean"здається дуже незмінним у довгостроковій перспективі. я здивований, що майже кожен пропонує створити власну функцію. Здається, це такий же рак, як і розширення нативних прототипів.

  • вам потрібно відтворити їх у кожному проекті, в якому ви берете участь
  • інші розробники можуть мати різні звички, або вам потрібно перевірити джерело вашої функції, щоб побачити, яке саме використання чека ви використовуєте, щоб знати, які слабкі моменти вашої перевірки
  • ви будете розчаровані, коли спробуєте написати один вкладиш у консолі на сайті, який не належить до вашого проекту

просто запам'ятай typeof v === "boolean"і все. Додайте шаблон до IDE, щоб мати змогу розмістити його за допомогою якихось трьох літер.


1
До речі, якщо продуктивність дуже важлива, функція для перевірки булевого значення зайняла в моїх тестах на 10% більше часу, ніж виконання вбудованого (for-loop 100000000x) на Node.js. Але найгіршим варіантом було те v === true || v === false, що у разі проведення 2 перевірок false. Ранжування: (1 - обидва прямі однакові) typeof v === 'booleanта typeof v === typeof true, (2) isBoolean(v), (3) v === true || v === false.
jpenna

Я не погоджуюся з цим від усієї душі. Різні звички - точна причина, чому: Як часто я відчував помилок, тому що всі перевіряли речі по-різному? Якщо у вас є одне місце для перевірки булевого значення, це набагато краще IMO для перевірок різного стилю по всій базі коду. Також набагато простіше послідовно змінювати поведінку такої функції.
Лукас Манцке

1
if(['true', 'yes', '1'].includes(single_value)) {
    return  true;   
}
else if(['false', 'no', '0'].includes(single_value)) {
    return  false;  
}

якщо у вас є рядок


1
  • Найчитабельніші: val === false || val === true .
  • Також читаємо: typeof variable == typeof true.
  • Найкоротший, але зовсім не читабельний: !!val === val .

    Пояснення:

    • [!!] Подвійний вигук перетворює значення в булеве.
    • [===] Тест потрійного рівняння на сувору рівність: і тип (булева), і значення повинні бути однаковими.
    • Якщо початкове значення не булеве, воно не пройде тест потрійних рівностей. Якщо це булева змінна, вона пройде тест потрійних рівностей (з обома типами та значенням).

    Тести:

    • !! 5 === 5 // false
    • !! 'test' === 'test' // false
    • нехай val = нова дата (); !! val === val // помилково
    • !! true === true // вірно
    • !! false === false // правда

0

У nodejs за допомогою node-boolify ми можемо використовувати isBoolean ();

        var isBoolean = require('node-boolify').isBoolean;
        isBoolean(true); //true
        isBoolean('true'); //true
        isBoolean('TRUE'); //false
        isBoolean(1); //true
        isBoolean(2); //false
        isBoolean(false); //true
        isBoolean('false'); //true
        isBoolean('FALSE'); //false
        isBoolean(0); //true
        isBoolean(null); //false
        isBoolean(undefined); //false
        isBoolean(); //false
        isBoolean(''); //false

Чи булеве повернення справжнє, лише якщо значення булеве значення
Ратан Удай Кумар

0

Ще одне рішення з функцією стрілки es2015

const isBoolean = val => typeof val === 'boolean';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.