Türün Boolean olup olmadığını kontrol etme


269

Bir değişkenin türünün Boolean türünde olup olmadığını nasıl kontrol edebilirim?

Yani, bazı alternatifler var:

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

Ama bu bana pek hoş gelmiyor.

Bunu başarmanın daha temiz bir yolu var mı?


1
Boolean türü trueveya falsetürü değil mi?
Matias Cicero

1
Kontrol etmenize gerek yok, bunu yapabilirsiniz !!( ... some expression ...)ve sonuç bir boole olacaktır.
Callum Linington

1
Hayır: trueve falsetip ilkelerdir boolean. Capital-B Boolean tipi, boole ilkelleri için bir nesne sarma tipidir.
Sivri

Boolean yapıcısı ile oluşturulan nesneler için çalışmayan @CallumLinington :)
Pointy

1
@CallumLinington şunu dener: if (new Boolean(false)) alert("hi");- büyük-B Boolean nesnesi, temeldeki küçük-b boolean değerine bakılmaksızın her zaman "doğrudur".
Sivri

Yanıtlar:


506

Bunun typeofiçin var. Parantez, bir işleç olduğu için isteğe bağlıdır .

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

7
OP'nin ne yapmaya çalıştığı açık değildir, ancak büyük harf B Boole nesneleri, türleri olarak "nesne" verir typeof.
Sivri

14
1) typeofbir işlev değildir. 2) = == üçlü operatörünü kullanmak typeofgerekmez, çünkü her zaman bir dize döndürür (afaik, ancak hatırladığım kadarıyla, bazı çok eski tarayıcılar için başka bir durum vardı). 3) typeofve dize karşılaştırmaları yavaştır. Onları kullanma. Doğrudan kontrol edin (variable === true || variable === false)(Bir işlev yazmanızı öneririm).
StanE

6
typeof(variable) === typeof(true)daha sağlam olmaz mıydı ?
Marcus Junius Brutus

2
@TusharNiras nameözel ile küresel bir pencere özelliktir alıcı developer.mozilla.org/en-US/docs/Web/API/Window/name
Zach Lysobey

1
@MarcusJuniusBrutus @AmitJoki bu saçmalık, typeof truebunun yerine daha ayrıntılı kullanmanın bir avantajı yok "boolean". ECMAScript'in yeni sürümlerinde asla herhangi bir değişiklik olmaz.
m93a

40

Sadece ilkel bir değer olup olmadığını kontrol etmek istiyorsanız

typeof variable === 'boolean'

Bazı garip nedenlerden dolayı yapıcı ile oluşturulan booleanlarınız varsa, bunlar gerçekten boolean değil, ilkel bir boolean değeri içeren nesnelerdir ve hem ilkel boolean'ları hem de ile oluşturulan nesneleri kontrol etmenin bir yolu new Boolean:

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


2
Boole ilkellerine ve Boolean nesnelerine aynı şekilde davranmak benim için çok pratik görünmüyor, çünkü onları yine de aynı şekilde kullanamıyorum.
Felix Kling

@FelixKling - benim için de çok pratik görünmüyor, ancak OP, bir değişkenin oluşturulduğunda bile new Boolean()teknik olarak bir boolean değil, bir nesne, ancak yine de tutan bir boolean olup olmadığını belirlemeye çalışıyor gibi görünüyor bir boole değeri.
adeneo

Bence OP sadece new Boolean()bir nesne döndürdüğünü bilmiyordu (soru hakkındaki yorumlara bakınız). Ama her neyse :)
Felix Kling

@FelixKling - Sadece soru ve yorumları tekrar okudum ve şimdi OP temelde yapmaya çalıştığını typeof variable === typeof new Boolean()ve muhtemelen sadece normal bir tip kontrol istediğini görüyorum , ancak bir şekilde garip jQuery sözdiziminde yakalandım.
adeneo

Eğer, kodunuzu yapmak istiyorum nasıl esnek bağlı boolgeçirilen param oldu hala olur değerlendirip bir istisna için çağrı atılmış olacaktır . : Böylece, Okumayı son satırı değiştirecek yalnızca değerlendirecek olan değil boş. nulltypeof bool === 'object'TypeError: Cannot read property 'valueOf' of nulltypeof bool.valueOf()(typeof bool === 'object' && bool && typeof bool.valueOf() === 'boolean');bool
Al Dass

34

İle saf JavaScript , sadece basitçe kullanabilirsiniz typeofve böyle bir şey yapmak typeof falseya da typeof trueve onu dönecektir "boolean"...

Ama bunu yapmanın tek yolu bu değil, JavaScript'te Boole için kontrol edebileceğiniz farklı yolları göstermek için aşağıdaki işlevleri oluşturuyorum , ayrıca bazı yeni çerçevelerde yapabileceğiniz farklı yollar, bununla başlayalım:

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

Veya tek satır ES6 yolu ...

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

ve şöyle deyin!

isBoolean(false); //return true

Ayrıca Underscore kaynak kodu onlar (_ ile fonksiyon adının başında.) Şöyle kontrol edin:

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

Ayrıca jQuery'de şöyle kontrol edebilirsiniz:

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

Gelen tepki , propTypes kullanıyorsanız, böyle boole olmak bir değer kontrol edebilirsiniz:

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

TypeScript kullanıyorsanız , boolean türünü de kullanabilirsiniz :

let isDone: boolean = false;

Ayrıca bunu yapmanın başka bir yolu, değeri boole'ye dönüştürmek ve hala aynı olup olmadığını görmek gibidir:

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

veya benzeri:

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

ve ara!

isBoolean(false); //return true

JavaScript için basit bir kontrol olduğu için bunun için herhangi bir çerçeve kullanılması önerilmez.


Katılmıyorum: new Boolean(true) === new Boolean(true)yanlış döndürmelidir (referanslar farklı olduğu için). Bu yüzden isBoolean(new Boolean(true))diyecekler yanlış olması gerekirken gerçek ( new Boolean(true)tip taşımaktadır boole ).
AlexMelw

17

Bunu jQuery ile veya jQuery olmadan kontrol etmenin üç "vanilya" yolu vardır.

  1. Birincisi, boolean değerlendirmeyi zorlama ile zorlamak, ardından orijinal değere eşit olup olmadığını kontrol etmektir:

    function isBoolean( n ) {
        return !!n === n;
    }
  2. Basit bir typeofkontrol yapmak:

    function isBoolean( n ) {
        return typeof n === 'boolean';
    }
  3. Bir sınıf sarıcısının bir ilkel üzerinde tamamen aşırı ve gereksiz bir şekilde başlatılması:

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

Üçüncüsü, sadece bir sınıf oluşturup true içeri girerseniz geri döner new Boolean.

İlkel baskılar (# 1'de gösterildiği gibi) hakkında ayrıntılı bilgi vermek için tüm ilkel tipler şu şekilde kontrol edilebilir:

  • Boolean:

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

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

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

Neden tip baskısı "en uygun"? Daha hızlı veya daha okunabilir typeofmi? Bundan oldukça şüpheliyim.
m93a

Bu nedenle, teoride, değeri bir boole'ye zorlamak 1 zorlama + 2 karşılaştırma + 1 karşılaştırma yapar. İlk iki karşılaştırma zorlama adımları sırasındadır ve son karşılaştırma ilk pozisyonla (şimdi ilkeldir) karşıdır. Yapmak typeofda 1 zorlamadır, ancak typeofyöntem en sonunda + 1 karşılaştırması içinde birkaç alıcı ve karşılaştırma yapar. İşte V8 referansıtypeof
iSkore

1
Sonuçta, her iki yöntem de çok hızlı, nanosaniye farkı çok küçük, hangisinin daha hızlı olduğunu test etmek bile zor olurdu. İşte iki JSPerf. Biri !!daha hızlı, biri Booleandaha hızlı diyor . Sadece testler arasındaki deltanın ne kadar küçük olduğuna dair bir referans. Boole denetimleri hızlıdır. jsperf.com/bool-not-not jsperf.com/bool-vs-doublenot
iSkore

Aradaki farkın ölçülebilir olmadığına katılıyorum ve bu durumda AFAIK her zaman önce gitmeli ise okunabilirlik. Böylece standart ve anlaşılır typeof val === "boolean"olan optimaldir.
m93a

1
Evet, buna katılıyorum. Okunabilirlik önemlidir. Operatörler okunabilir değil - güncelleme olacak
iSkore

16

Bunu başarmak için saf Javascript kullanabilirsiniz:

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

7

İşlevinizin boolean nesnelerini de doğrulayabilmesini istiyorsanız, en etkili çözüm şöyle olmalıdır:

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

instanceof Boolean benim için beyan edilmedi.
Dudi

3

JavaScript'te bir değişkenin türünü kontrol etmenin en güvenilir yolu şudur :

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"

Bu komplikasyonun nedeni, typeof truegeri "boolean"dönerken typeof new Boolean(true)geri dönmesidir "object".


"boolean"Değer gerçekten bir nesne ise neden geri dönmek istersiniz ? Bu benim için pek pratik görünmüyor. Boolean nesneleri zaten Boolean ilkellerinden farklı şekilde ele alınmalıdır.
Felix Kling

1
Kod temiz, güzel veya net değil. OP'nin "bunu başarmanın daha temiz bir yolunu" istediğini unutmayın.
Spencer Wieczorek

Kodun temiz veya güzel olmadığını kabul ediyorum, ancak AFAIK, hem bool ilkelleri hem de Boolean nesnelerini sahnede güzel ve aynı zamanda güvenilir bir seçenek yok.
Volodymyr Frolov

Bu, yerel olarak yapılabilecek bir şey yapmak için aşırı derecede aşırı bir çözüm gibi görünüyor.
brandonscript

3

Lodash ile gitmek istiyorum: isBoolean geçirilen değişken ilkel boolean veya Boolean sarıcı nesne olup olmadığını denetler ve böylece tüm durumlar için hesaplar.


1

typeofBir bağımsız değişkeni kontrol eden bir işlev oluşturabilirsiniz .

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

1

Bazen kontrol etmek için tek bir yola ihtiyacımız var. typeof tarih vb için çalışmıyor. Böylece kolay

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

Ayrıca için Number, String, Booleanvb sık sık tek şekilde türünü kontrol gerekiyor ...


1

isBooleanOneliner içeren fonksiyonlar oluşturmak typeof v === "boolean"uzun vadede çok kullanışlı görünmüyor. Neredeyse herkesin kendi işlevinizi yaratmasını önermesinden şaşırıyorum. Yerli prototipleri genişletmekle aynı kanser gibi görünüyor.

  • katıldığınız her projede bunları yeniden oluşturmanız gerekir
  • diğer geliştiricilerin farklı alışkanlıkları olabilir, ya da kontrolün zayıf noktalarının ne olduğunu bilmek için hangi kontrol imgesini kullandığınızı görmek için işlevinizin kaynağını kontrol etmeniz gerekebilir
  • projenize ait olmayan bir konsolda konsolda bir astar yazmaya çalışacağınız zaman meyve vereceksiniz

sadece not edin typeof v === "boolean"ve hepsi bu. Üç harfli bir kısayolla yerleştirmek ve mutlu olmak için IDE'nize bir şablon ekleyin.


1
Bu arada, performans çok önemliyse, boolean değerini kontrol etme fonksiyonuna sahip olmak, testlerimde Node.js'de satır içi (for-loop 100000000x) yapmaktan% 10 daha fazla zaman aldı. Ama en kötü seçenek v === true || v === false, hangi durumda 2 doğrulama yapar false. Sıralama: (1 - her ikisi de pratik olarak aynı) typeof v === 'booleanve typeof v === typeof true, (2) isBoolean(v), (3) v === true || v === false.
jpenna

Bütün kalbimle buna katılmıyorum. Farklı alışkanlıklar bunun tam sebebidir: Herkes olayları farklı bir şekilde kontrol ettiği için ne sıklıkla hatalar yaşadım? Boole değerini kontrol etmek için tek bir yeriniz varsa, kod tabanının her yerinde farklı stil kontrollerine göre daha çok tercih edilen IMO'dur. Ayrıca böyle bir işlevin davranışını tutarlı bir şekilde değiştirmek çok daha kolaydır.
Lucas Manzke

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

eğer bir ipin varsa


1
  • En okunabilir: val === false || val === true.
  • Ayrıca okunabilir: typeof variable == typeof true.
  • Hiç kısa, fakat okunabilir değil: !!val === val.

    Açıklama:

    • [!!] Çift ünlem işareti, değeri bir Boole değerine dönüştürür.
    • [===] Üçlü katı eşitlik testine eşittir : hem tür (Boolean) hem de değer aynı olmalıdır.
    • Orijinal değer bir Boole değeri değilse, üçlü eşitlik testini geçmez. Eğer bir Boolean değişkeni ise, üçlü eşitlik testini geçecektir (hem tip hem de değerle birlikte).

    Testler:

    • !! 5 === 5 // yanlış
    • !! 'test' === 'test' // yanlış
    • let val = new Date (); !! val === val // yanlış
    • !! true === true // true
    • !! false === false // true

0

Düğümlerde node-boolify kullanarak 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

Boolean return yalnızca value boolean value ise true
Ratan Uday Kumar

0

Es2015 ok işlevi ile bir karar daha

const isBoolean = val => typeof val === 'boolean';
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.