Cara memeriksa apakah tipe adalah Boolean

269

Bagaimana saya bisa memeriksa apakah tipe variabel adalah tipe Boolean?

Maksud saya, ada beberapa alternatif seperti:

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

Tetapi bagi saya itu tidak terlihat bagus.

Apakah ada cara yang lebih bersih untuk mencapai ini?

Matias Cicero
sumber
1
Bukan trueatau falsetipe Boolean?
Matias Cicero
1
Anda tidak perlu memeriksa, Anda dapat melakukan ini !!( ... some expression ...)dan hasilnya akan menjadi boolean.
Callum Linington
1
Tidak: truedan falsemerupakan tipe primitif boolean. Tipe kapital-B Boolean adalah tipe pembungkus objek untuk primitif boolean.
Pointy
@CallumLinington yang tidak akan berfungsi untuk objek yang dibuat dengan konstruktor Boolean :)
Pointy
1
@CallumLinington coba: if (new Boolean(false)) alert("hi");- objek Boolean kapital-B selalu "benar", terlepas dari nilai boolean kecil-b yang mendasarinya.
Pointy

Jawaban:

506

Itulah gunanya typeof. Tanda kurung bersifat opsional karena merupakan operator .

if (typeof variable === "boolean"){
  // variable is a boolean
}
Amit Joki
sumber
7
Tidak jelas apa yang OP coba lakukan, tetapi objek Boolean kapital-B memberikan "objek" sebagai tipenya typeof.
Pointy
14
1) typeofbukan fungsi. 2) Menggunakan operator triple === dengan typeoftidak diperlukan, karena akan selalu mengembalikan string (afaik, tapi sejauh yang saya ingat, ada kasus lain untuk beberapa browser yang sangat lama). 3) typeofdan perbandingan string lambat. Jangan gunakan itu. Periksa langsung dengan (variable === true || variable === false)(saya sarankan untuk menulis fungsi).
StanE
6
tidak typeof(variable) === typeof(true)akan lebih kuat?
Marcus Junius Brutus
2
@TusharNiras nameadalah properti jendela global dengan spesial getter developer.mozilla.org/en-US/docs/Web/API/Window/name
Zach Lysobey
1
@MarcusJuniusBrutus @AmitJoki itu tidak masuk akal, tidak ada keuntungan menggunakan lebih banyak verbose typeof truedaripada"boolean" . Versi baru ECMAScript tidak akan pernah memiliki perubahan apa pun.
m93a
40

Jika Anda hanya ingin memeriksa nilai primitif

typeof variable === 'boolean'

Jika karena alasan aneh Anda memiliki boolean yang dibuat dengan konstruktor, itu bukan boolean tetapi objek yang mengandung nilai boolean primitif, dan salah satu cara untuk memeriksa boolean primitif dan objek yang dibuat new Booleanadalah dengan melakukan:

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

Adeneo
sumber
2
Rasanya tidak praktis bagi saya untuk memperlakukan benda Boolean primitif dan Boolean sebagai hal yang sama, karena saya toh tidak bisa menggunakannya dengan cara yang sama.
Felix Kling
@ Feliksling - tampaknya tidak terlalu praktis bagi saya juga, tetapi sepertinya OP sedang mencoba untuk menentukan apakah suatu variabel adalah boolean, bahkan ketika dibuat dengan new Boolean(), yang secara teknis bukan boolean, tetapi objek, tetapi masih memegang nilai boolean.
adeneo
Saya pikir OP tidak tahu bahwa new Boolean()mengembalikan objek (lihat komentar pada pertanyaan). Tapi apa pun :)
Felix Kling
@FelixKling - Baca ulang pertanyaan dan komentarnya, dan saya melihat sekarang bahwa OP pada dasarnya mencoba untuk melakukan typeof variable === typeof new Boolean()dan mungkin hanya ingin pemeriksaan typeof biasa, tetapi entah bagaimana terjebak dalam beberapa sintaks jQuery yang aneh sebagai gantinya.
adeneo
Tergantung pada bagaimana tangguh Anda ingin membuat kode Anda, jika boolparam lewat di itu nullyang typeof bool === 'object'masih akan mengevaluasi dan TypeError: Cannot read property 'valueOf' of nullpengecualian akan dilemparkan pada panggilan untuk typeof bool.valueOf(). Jadi, saya akan mengubah baris terakhir untuk membaca: (typeof bool === 'object' && bool && typeof bool.valueOf() === 'boolean');yang akan mengevaluasi hanya ketika booladalah tidak nol.
Al Dass
35

Dengan JavaScript murni , Anda cukup menggunakan typeofdan melakukan sesuatu seperti typeof falseatau typeof truedan itu akan kembali "boolean"...

Tapi itu bukan satu-satunya cara untuk melakukan itu, saya membuat fungsi di bawah ini untuk menunjukkan berbagai cara Anda dapat memeriksa Boolean dalam JavaScript, juga berbagai cara yang dapat Anda lakukan dalam beberapa kerangka kerja baru, mari kita mulai dengan yang ini:

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

Atau satu cara ES6 ...

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

dan menyebutnya seperti!

isBoolean(false); //return true

Juga dalam kode sumber Garis Bawah mereka memeriksanya seperti ini (dengan _. Di awal nama fungsi):

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

Juga di jQuery Anda dapat memeriksanya seperti ini:

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

Di Bereaksi , jika menggunakan propTypes, Anda dapat memeriksa nilai menjadi boolean seperti ini:

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

Jika menggunakan TypeScript , Anda dapat menggunakan tipe boolean juga:

let isDone: boolean = false;

Juga cara lain untuk melakukannya, seperti mengubah nilai menjadi boolean dan melihat apakah masih sama persis, sesuatu seperti:

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

atau seperti:

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

dan sebut saja!

isBoolean(false); //return true

Tidak disarankan menggunakan kerangka apa pun untuk ini karena ini benar-benar pemeriksaan sederhana dalam JavaScript.

Alireza
sumber
Tidak setuju: new Boolean(true) === new Boolean(true)harus mengembalikan false (karena referensi berbeda). Itu sebabnya surat isBoolean(new Boolean(true))wasiat itu mengatakan false sementara itu pasti benar ( new Boolean(true)adalah tipe boolean ).
AlexMelw
17

Ada tiga cara "vanilla" untuk memeriksanya dengan atau tanpa jQuery.

  1. Pertama adalah memaksa evaluasi boolean dengan paksaan, lalu periksa apakah itu sama dengan nilai asli:

    function isBoolean( n ) {
        return !!n === n;
    }
  2. Melakukan pemeriksaan sederhana typeof:

    function isBoolean( n ) {
        return typeof n === 'boolean';
    }
  3. Melakukan pemborosan kelas yang sepenuhnya berlebihan dan tidak perlu pada primatif:

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

Yang ketiga hanya akan kembali true jika Anda membuat new Booleankelas dan meneruskannya.

Untuk menguraikan paksaan primitif (seperti yang ditunjukkan dalam # 1), semua tipe primitif dapat diperiksa dengan cara ini:

  • Boolean:

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

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

    function isString( n ) {
        return ''+n === n;
    }
iSkore
sumber
Mengapa koersi tipe "paling optimal"? Apakah lebih cepat atau lebih mudah dibaca daripada typeof? Saya sangat meragukannya.
m93a
Jadi, secara teori, paksaan nilai ke boolean melakukan 1 paksaan + 2 perbandingan + 1 perbandingan. Dua perbandingan pertama adalah selama langkah pemaksaan, dan perbandingan terakhir bertentangan dengan posisi pertama (yang sekarang primitif). Melakukan typeofjuga 1 paksaan, tetapi typeofmetode ini melakukan beberapa getter dan perbandingan di dalam +1 perbandingan di bagian paling akhir. Inilah referensi V8 untuktypeof
iSkore
1
Lagi pula, metode mana pun sangat cepat, jumlah perbedaan nanodetik sangat kecil, akan sulit untuk bahkan menguji mana yang lebih cepat. Berikut adalah dua JSPerf. Satu kata !!lebih cepat, satu kata Booleanlebih cepat. Hanya referensi seberapa kecil delta di antara tes. Cek Boolean cepat. jsperf.com/bool-not-not jsperf.com/bool-vs-doublenot
iSkore
Saya setuju bahwa perbedaannya tidak dapat diukur dan dalam hal ini, readabilidy harus AFAIK selalu menjadi yang pertama. Dengan demikian standar dan komprehensif typeof val === "boolean"adalah optimal.
m93a
1
Ya saya setuju dengan itu. Keterbacaan itu penting. Operator tidak dapat dibaca - akan diperbarui
iSkore
16

Anda dapat menggunakan Javascript murni untuk mencapai ini:

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

Jika Anda ingin fungsi Anda dapat memvalidasi objek boolean juga, solusi yang paling efisien adalah:

function isBoolean(val) {
  return val === false || val === true || val instanceof Boolean;
}
Willem Franco
sumber
instanceof Boolean tidak dideklarasikan untuk saya.
Dudi
3

Cara paling dapat diandalkan untuk memeriksa jenis variabel dalam JavaScript adalah sebagai berikut :

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"

Alasan untuk komplikasi ini adalah typeof truepengembalian "boolean"sementara typeof new Boolean(true)pengembalian "object".

Volodymyr Frolov
sumber
Mengapa Anda ingin kembali "boolean"jika nilainya benar-benar objek? Bagi saya itu tidak terlalu praktis. Objek Boolean harus ditangani secara berbeda dari primitif Boolean.
Felix Kling
1
Kode tidak bersih, cantik, atau tidak jelas. Perhatikan OP meminta "cara yang lebih bersih untuk mencapai ini".
Spencer Wieczorek
Saya setuju bahwa kodenya tidak bersih atau cantik, tetapi AFAIK tidak ada opsi cantik dan sekaligus dapat diandalkan untuk berjaga-jaga jika boolean primitif dan objek Boolean ada di lokasi.
Volodymyr Frolov
Ini sepertinya solusi serius yang terlalu berat untuk melakukan sesuatu yang bisa dilakukan secara asli.
naskah merek
3

Saya akan pergi dengan Lodash: isBoolean memeriksa apakah variabel yang lewat adalah boolean primitif atau objek wrapper Boolean dan dengan demikian menyumbang semua kasus.

Marcus Junius Brutus
sumber
1

Anda dapat membuat fungsi yang memeriksa typeofargumen.

function isBoolean(value) {
  return typeof value === "boolean";
}
Mohsen Kadoura
sumber
1

Terkadang kita membutuhkan satu cara untuk memeriksanya. typeof tidak berfungsi untuk kencan dll. Jadi saya membuatnya mudah

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

Juga untuk Number, String, Booleandll kita sering perlu untuk memeriksa jenis dengan cara tunggal ...

Imam Kuncoro
sumber
1

Membuat fungsi seperti isBooleanyang berisi oneliner typeof v === "boolean"sepertinya sangat tidak nyaman dalam jangka panjang. Saya terkejut bahwa hampir semua orang menyarankan untuk membuat fungsi Anda sendiri. Sepertinya kanker yang sama dengan memperluas prototipe asli.

  • Anda perlu membuatnya kembali di setiap proyek yang Anda terlibat
  • pengembang lain mungkin memiliki kebiasaan berbeda, atau perlu memeriksa sumber fungsi Anda untuk melihat penerapan pemeriksaan yang Anda gunakan, untuk mengetahui apa saja titik lemah pemeriksaan Anda.
  • Anda akan terbuai ketika Anda akan mencoba untuk menulis satu liner di konsol di situs yang bukan milik proyek Anda

hanya memoize typeof v === "boolean"dan itu saja. Tambahkan templat ke IDE Anda untuk membuatnya dengan tiga shortcut huruf dan berbahagialah.

Kamil Orzechowski
sumber
1
By the way, jika kinerja sangat sangat penting, memiliki fungsi untuk memeriksa nilai boolean mengambil 10% lebih banyak waktu dalam pengujian saya daripada melakukannya inline (for-loop 100000000x) di Node.js. Tetapi opsi terburuk adalah v === true || v === false, yang melakukan 2 verifikasi dalam kasus false. Peringkat: (1 - keduanya sama praticaly) typeof v === 'booleandan typeof v === typeof true, (2) isBoolean(v), (3) v === true || v === false.
jpenna
Saya tidak setuju dengan ini sepenuh hati. Kebiasaan yang berbeda adalah alasan yang tepat mengapa: Seberapa sering saya mengalami bug karena semua orang memeriksa berbagai hal secara berbeda? Jika Anda memiliki satu tempat untuk memeriksa nilai boolean, itu jauh lebih disukai IMO daripada cek gaya yang berbeda di seluruh basis kode. Juga jauh lebih mudah untuk secara konsisten mengubah perilaku fungsi semacam itu.
Lucas Manzke
1
if(['true', 'yes', '1'].includes(single_value)) {
    return  true;   
}
else if(['false', 'no', '0'].includes(single_value)) {
    return  false;  
}

jika Anda memiliki string

Denver
sumber
1
  • Yang paling mudah dibaca: val === false || val === true .
  • Juga dibaca: typeof variable == typeof true.
  • Yang terpendek, tetapi tidak dapat dibaca sama sekali: !!val === val .

    Penjelasan:

    • [!!] Seruan ganda mengubah nilai menjadi Boolean.
    • [===] Tiga sama dengan tes untuk kesetaraan yang ketat: baik tipe (Boolean) dan nilainya harus sama.
    • Jika nilai asli bukan nilai Boolean, itu tidak akan lulus tes triple equals. Jika itu adalah variabel Boolean, itu akan lulus tes triple equals (dengan kedua jenis & nilai).

    Tes:

    • !! 5 === 5 // salah
    • !! 'test' === 'test' // false
    • biarkan val = Tanggal baru (); !! val === val // false
    • !! benar === benar // benar
    • !! false === false // benar
TechWisdom
sumber
0

Dalam nodejs dengan menggunakan node-boolify kita bisa menggunakan 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
sumber
Apakah boolean mengembalikan nilai true hanya jika nilainya adalah nilai boolean
Ratan Uday Kumar
0

Satu keputusan lagi dengan fungsi panah es2015

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