Jak sprawdzić, czy typ ma wartość logiczną

269

Jak mogę sprawdzić, czy typ zmiennej jest typu Boolean?

Mam na myśli kilka alternatyw, takich jak:

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

Ale to nie wydaje mi się ładne.

Czy istnieje czystszy sposób na osiągnięcie tego?

Matias Cicero
źródło
1
Nie są truelub falsetypu Boolean?
Matias Cicero
1
Nie musisz sprawdzać, możesz to zrobić, !!( ... some expression ...)a wynik będzie logiczny.
Callum Linington
1
Nie: truei falsesą prymitywami typu boolean. Kapital B typu Boolean jest typem opakowania obiektu dla operacji logicznych.
Pointy
@CallumLinington, który nie będzie działał dla obiektów utworzonych za pomocą konstruktora boolowskiego :)
Pointy
1
@CallumLinington spróbuj: if (new Boolean(false)) alert("hi");- boolowski obiekt typu B jest zawsze „prawdziwy”, niezależnie od wartości logicznej little-b.
Pointy

Odpowiedzi:

506

Po to typeofjest. Nawiasy są opcjonalne, ponieważ jest to operator .

if (typeof variable === "boolean"){
  // variable is a boolean
}
Amit Joki
źródło
7
Nie jest jasne, co OP próbuje zrobić, ale obiekty typu Boolean z literą B dają „obiekt” jako swój typ typeof.
Pointy
14
1) typeofnie jest funkcją. 2) Używanie potrójnego operatora === z typeofnie jest wymagane, ponieważ zawsze zwraca ciąg (afaik, ale o ile pamiętam, był inny przypadek dla niektórych bardzo starych przeglądarek). 3) typeofi porównania ciągów są powolne. Nie używaj ich. Sprawdź bezpośrednio za pomocą (variable === true || variable === false)(proponuję napisać funkcję).
StanE
6
nie typeof(variable) === typeof(true)byłby bardziej solidny?
Marcus Junius Brutus
2
@TusharNiras nameto globalna właściwość okna ze specjalnym programem pobierającym developer.mozilla.org/en-US/docs/Web/API/Window/name
Zach Lysobey
1
@MarcusJuniusBrutus @AmitJoki to nonsens, nie ma przewagi w używaniu większej ilości słów typeof truezamiast "boolean". Nowe wersje ECMAScript nigdy nie będą miały przełomowych zmian.
m93a
40

Jeśli chcesz po prostu sprawdzić pierwotną wartość

typeof variable === 'boolean'

Jeśli z jakiegoś dziwnego powodu masz booleany utworzone za pomocą konstruktora, nie są to tak naprawdę booleany, ale obiekty zawierające prymitywną wartość boolowską, a jednym ze sposobów sprawdzenia zarówno prymitywnych boolanów i obiektów utworzonych za pomocą new Booleanjest:

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

adeneo
źródło
2
Nie wydaje mi się zbyt praktyczne traktowanie prymitywów boolowskich i obiektów boolowskich jako takich samych, ponieważ i tak nie mogę ich używać w ten sam sposób.
Felix Kling
@ FelixKling - nie wydaje mi się też zbyt praktyczny, ale wydaje się, że OP próbuje ustalić, czy zmienna jest wartością logiczną, nawet gdy jest tworzona za pomocą new Boolean(), która technicznie nie jest wartością logiczną, ale jest obiektem, ale nadal trzyma wartość logiczna.
adeneo
Myślę, że OP po prostu nie wiedział, że new Boolean()zwraca obiekt (patrz komentarze do pytania). Ale cokolwiek :)
Felix Kling
@ FelixKling - po prostu ponownie przeczytaj pytanie i komentarze, i widzę teraz, że OP w zasadzie próbuje to zrobić typeof variable === typeof new Boolean()i prawdopodobnie po prostu chcę regularnego sprawdzania typu, ale jakoś wpadło w jakąś dziwną składnię jQuery.
adeneo
W zależności od sposobu sprężysty chcesz mieć swój kod, jeśli boolparam przekazany był nadal oceniać i Wyjątkiem byłyby wyrzucone na wywołaniu . Dlatego zmieniłbym ten ostatni wiersz na przeczytany: który oceni tylko wtedy, gdy nie jest pusty. nulltypeof bool === 'object'TypeError: Cannot read property 'valueOf' of nulltypeof bool.valueOf()(typeof bool === 'object' && bool && typeof bool.valueOf() === 'boolean');bool
Al Dass,
34

Dzięki czystemu JavaScriptowi możesz po prostu użyć typeofi zrobić coś takiego typeof falselub, typeof truea on zwróci "boolean"...

Ale to nie jedyny sposób, aby to zrobić, poniżej tworzę funkcje, aby pokazać różne sposoby sprawdzania Boolean w JavaScript, a także różne sposoby, w jakie możesz to zrobić w niektórych nowych ramach, zacznijmy od tego:

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

Lub jedno-liniowy sposób ES6 ...

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

i nazwij to tak!

isBoolean(false); //return true

Również w kodzie źródłowym podkreślenia sprawdzają to w ten sposób (z _. Na początku nazwy funkcji):

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

Również w jQuery możesz to sprawdzić w następujący sposób:

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

W React , jeśli używasz propTypes, możesz sprawdzić wartość logiczną:

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

Jeśli używasz TypeScript , możesz także użyć typu boolean :

let isDone: boolean = false;

Innym sposobem na zrobienie tego jest konwersja wartości na wartość logiczną i sprawdzenie, czy nadal jest dokładnie taka sama, na przykład:

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

lub jak:

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

i nazwij to!

isBoolean(false); //return true

Nie jest zalecane używanie do tego żadnych ram, ponieważ jest to naprawdę proste sprawdzenie w JavaScript.

Alireza
źródło
Nie zgadzam się: new Boolean(true) === new Boolean(true)powinien zwrócić wartość false (ponieważ odniesienia są różne). Dlatego isBoolean(new Boolean(true))powie fałszywe, podczas gdy musi być prawdziwe ( new Boolean(true)typu boolean ).
AlexMelw
17

Istnieją trzy „waniliowe” sposoby na sprawdzenie tego z lub bez jQuery.

  1. Najpierw należy wymusić ocenę logiczną przez przymus, a następnie sprawdzić, czy jest równa pierwotnej wartości:

    function isBoolean( n ) {
        return !!n === n;
    }
  2. Przeprowadzanie prostej typeofkontroli:

    function isBoolean( n ) {
        return typeof n === 'boolean';
    }
  3. Wykonanie całkowicie przesadnej i niepotrzebnej instancji opakowania klasy na prymitywie:

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

Trzeci powróci tylko true wtedy , gdy utworzysz new Booleanklasę i przekażesz ją.

Aby rozwinąć przymus prymitywów (jak pokazano w punkcie 1), wszystkie typy prymitywów można sprawdzić w ten sposób:

  • Boolean:

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

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

    function isString( n ) {
        return ''+n === n;
    }
iSkore
źródło
Dlaczego kooperacja typów jest „najbardziej optymalna”? Czy to jest szybsze czy bardziej czytelne niż typeof? Szczerze w to wątpie.
m93a
Teoretycznie więc wymuszenie wartości na wartość logiczną powoduje 1 przymus + 2 porównania + 1 porównanie. Pierwsze dwa porównania odbywają się podczas kroków przymusu, a ostatnie porównanie dotyczy pierwszej pozycji (która jest teraz prymitywna). Wykonanie typeofto również 1 przymus, ale typeofmetoda wykonuje kilka pobrań i porównań wewnątrz + 1 porównanie na samym końcu. Oto odniesienie do V8 dlatypeof
iSkore,
1
W końcu każda metoda jest tak cholernie szybka, że ​​różnica nanosekund jest tak mała, że ​​trudno byłoby nawet przetestować, która była szybsza. Oto dwa JSPerf. Mówi się, że !!jest szybszy, mówi się, że Booleanjest szybszy. Tylko odniesienie do tego, jak mała jest różnica między testami. Kontrola logiczna przebiega szybko. jsperf.com/bool-not-not jsperf.com/bool-vs-doublenot
iSkore
Zgadzam się, że różnica nie jest mierzalna i w takim przypadku AFAIK powinien zawsze iść na pierwszym miejscu. Zatem standard i zrozumiałość typeof val === "boolean"są optymalne.
m93a
1
Tak, zgadzam się z tym. Czytelność jest ważna. Operatorzy nie są tak czytelni - zaktualizują
iSkore
16

Aby to osiągnąć, możesz użyć czystego Javascript.

var test = true;
if (typeof test === 'boolean')
   console.log('test is a boolean!');
Morry
źródło
7

Jeśli chcesz, aby Twoja funkcja mogła również sprawdzać poprawność obiektów boolowskich, najbardziej wydajnym rozwiązaniem musi być:

function isBoolean(val) {
  return val === false || val === true || val instanceof Boolean;
}
Willem Franco
źródło
instanceof Boolean nie jest dla mnie zadeklarowany.
Dudi
3

Najbardziej wiarygodnym sposobem sprawdzenia typ zmiennej w JavaScripcie jest następujący :

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"

Powodem tej komplikacji jest to, że typeof truewraca "boolean"podczas typeof new Boolean(true)powrotu "object".

Włodzimierz Frolow
źródło
Dlaczego miałbyś chcieć zwrócić, "boolean"jeśli wartość naprawdę jest przedmiotem? Nie wydaje mi się to zbyt praktyczne. Zresztą obiekty boolowskie muszą być traktowane inaczej niż prymitywy boolowskie.
Felix Kling
1
Kod nie jest czysty, ładny ani jasny. Zauważ, że OP prosi o „czystszy sposób na osiągnięcie tego”.
Spencer Wieczorek
Zgadzam się, że kod nie jest czysty ani ładny, ale AFAIK nie ma ładnej, a jednocześnie niezawodnej opcji na wypadek, gdyby na scenie były zarówno operacje logiczne, jak i obiekty logiczne.
Volodymyr Frolov
Wydaje się, że jest to rozwiązanie stanowiące poważną przesadę, aby zrobić coś, co można zrobić natywnie.
brandonscript
3

Wybrałbym Lodash: isBoolean sprawdza, czy przekazana zmienna jest pierwotnym obiektem typu boolean, czy też obiekt logiczny Boolean, a więc uwzględnia wszystkie przypadki.

Marcus Junius Brutus
źródło
1

Możesz utworzyć funkcję, która sprawdza typeofargument.

function isBoolean(value) {
  return typeof value === "boolean";
}
Mohsen Kadoura
źródło
1

Czasami potrzebujemy jednego sposobu, aby to sprawdzić. typeof nie działa na randkę itp. Ułatwiłem więc

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

Również Number, String, Booleanitd. Często musimy sprawdzić typ w jednym drodze ...

Imam Kuncoro
źródło
1

Tworzenie funkcji takich jak isBooleanoneliner typeof v === "boolean"wydaje się w dłuższej perspektywie bardzo niewygodne. Jestem zaskoczony, że prawie wszyscy sugerują stworzenie własnej funkcji. Wydaje się, że jest to ten sam rak, co rozszerzanie natywnych prototypów.

  • musisz je odtworzyć w każdym zaangażowanym projekcie
  • inni programiści mogą mieć inne nawyki, lub muszą sprawdzić źródło twojej funkcji, aby zobaczyć, z jakiego impulsu czeku korzystasz, aby dowiedzieć się, jakie są słabe strony twojego czeku
  • poczujesz frustrację, gdy spróbujesz napisać jedną konsolę w konsoli na stronie, która nie należy do twojego projektu

po prostu zapamiętaj typeof v === "boolean"i to wszystko. Dodaj szablon do swojego IDE, aby móc go umieścić za pomocą trzyliterowego skrótu i ​​być szczęśliwym.

Kamil Orzechowski
źródło
1
Nawiasem mówiąc, jeśli wydajność jest bardzo bardzo ważna, posiadanie funkcji sprawdzania wartości logicznej zajęło w moich testach 10% więcej czasu niż wykonywanie jej w trybie wewnętrznym (dla pętli 100000000x) w Node.js. Ale najgorszą opcją było v === true || v === false, w przypadku 2 weryfikacji false. Ranking: (1 - oba są praktycznie takie same) typeof v === 'booleanoraz typeof v === typeof true, (2) isBoolean(v), (3) v === true || v === false.
jpenna
Nie zgadzam się z tym całym sercem. Różne nawyki są dokładnym powodem, dla którego: Jak często występowałem błędy, ponieważ wszyscy sprawdzali różne rzeczy? Jeśli masz jedno miejsce do sprawdzenia wartości logicznej, jest to o wiele lepsze IMO niż kontrole w innym stylu w całej bazie kodu. Znacznie łatwiej jest też konsekwentnie zmieniać zachowanie takiej funkcji.
Lucas Manzke
1
if(['true', 'yes', '1'].includes(single_value)) {
    return  true;   
}
else if(['false', 'no', '0'].includes(single_value)) {
    return  false;  
}

jeśli masz ciąg

Denver
źródło
1
  • Najbardziej czytelny: val === false || val === true.
  • Również czytelny: typeof variable == typeof true.
  • Najkrótsza, ale nie w ogóle czytelny: !!val === val.

    Wyjaśnienie:

    • [!!] Podwójny wykrzyknik przekształca wartość w wartość logiczną.
    • [===] Test potrójnej równości zapewnia ścisłą równość: zarówno typ (wartość logiczna), jak i wartość muszą być takie same.
    • Jeśli oryginalna wartość nie jest wartością logiczną, nie przejdzie testu potrójnej równości. Jeśli jest to zmienna boolowska, przejdzie test potrójnej równości (zarówno z typem, jak i wartością).

    Testy:

    • !! 5 === 5 // false
    • !! „test” === „test” // false
    • let val = nowa data (); !! val === val // false
    • !! true === true // true
    • !! false === false // true
TechWisdom
źródło
0

W nodejs za pomocą node-boolify możemy użyć 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
Ratan Uday Kumar
źródło
Czy wartość logiczna jest prawdziwa tylko wtedy, gdy wartość jest wartością logiczną
Ratan Uday Kumar
0

Jeszcze jedna decyzja z funkcją strzałki es2015

const isBoolean = val => typeof val === 'boolean';
Gor
źródło