วิธีตรวจสอบว่าเป็นประเภทบูลีนหรือไม่


269

ฉันจะตรวจสอบว่าประเภทของตัวแปรเป็นประเภทบูลีนได้อย่างไร

ฉันหมายถึงมีทางเลือกบางอย่างเช่น:

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

แต่นั่นไม่ได้ดูสวยสำหรับฉัน

มีวิธีที่สะอาดกว่าเพื่อให้บรรลุสิ่งนี้หรือไม่?


1
ไม่ใช่trueหรือfalseพิมพ์บูลีน?
Matias Cicero

1
คุณไม่จำเป็นต้องตรวจสอบคุณสามารถทำได้!!( ... some expression ...)และผลลัพธ์จะเป็นบูลีน
Callum Linington

1
ไม่: trueและfalseเป็นประเภทbooleanพื้นฐาน capital-B Boolean type เป็นชนิด wrapper วัตถุสำหรับคำสั่งบูลีน
Pointy

@CallumLinington ที่จะไม่ทำงานสำหรับวัตถุที่สร้างขึ้นด้วยคอนสตรัคบูลีน :)
Pointy

1
@CallumLinington ลอง: if (new Boolean(false)) alert("hi");- วัตถุบูลีน B-B เป็น "ความจริง" เสมอโดยไม่คำนึงถึงค่าบูลีน little-b พื้นฐาน
Pointy

คำตอบ:


506

นั่นคือสิ่งที่typeofมีอยู่ วงเล็บเป็นตัวเลือกเพราะมันเป็นผู้ประกอบการ

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

7
มันไม่ชัดเจนว่า OP จะพยายามที่จะทำ แต่วัตถุทุน-B บูลีนให้ "วัตถุ" typeofเป็นประเภทพวกเขาผ่านทาง
Pointy

14
1) typeofไม่ใช่ฟังก์ชั่น 2) การใช้ตัวดำเนินการสามตัว === with typeofไม่จำเป็นเนื่องจากมันจะส่งคืนสตริงเสมอ (afaik แต่เท่าที่ฉันจำได้มีกรณีอื่นสำหรับเบราว์เซอร์ที่เก่ามาก) 3) typeofและการเปรียบเทียบสตริงช้า อย่าใช้มัน ตรวจสอบโดยตรงกับ(variable === true || variable === false)(ฉันขอแนะนำให้เขียนฟังก์ชั่น)
StanE

6
จะไม่typeof(variable) === typeof(true)แข็งแกร่งกว่านี้หรือ
Marcus Junius Brutus

2
@TusharNiras nameเป็นสถานที่ให้บริการหน้าต่างระดับโลกที่มีผู้พัฒนาgetter พิเศษ.
mozilla.org/en-US/docs/Web/API/Window/name

1
@MarcusJuniusBrutus @AmitJoki ที่ไร้สาระไม่เป็นประโยชน์อะไรในการใช้มากขึ้น verbose แทน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 - ดูเหมือนจะไม่เป็นประโยชน์กับฉันเหมือนกัน แต่ดูเหมือนว่า OP พยายามที่จะตรวจสอบว่าตัวแปรเป็นบูลีนหรือไม่แม้ว่าจะสร้างขึ้นด้วยnew Boolean()ซึ่งในทางเทคนิคแล้วไม่ใช่บูลีน แต่เป็นวัตถุ แต่ยังคงมีอยู่ ค่าบูลีน
adeneo

ฉันคิดว่า OP ไม่ทราบว่าnew Boolean()จะส่งคืนวัตถุ (ดูความคิดเห็นเกี่ยวกับคำถาม) แต่อะไรก็ตาม :)
เฟลิกซ์คลิง

@ FelixKling - เพียงอ่านคำถามและความคิดเห็นอีกครั้งและตอนนี้ฉันเห็นว่า OP พยายามที่จะทำtypeof variable === typeof new Boolean()และอาจแค่ต้องการการตรวจสอบแบบปกติ
adeneo

ทั้งนี้ขึ้นอยู่กับวิธีการที่มีความยืดหยุ่นที่คุณต้องการให้รหัสของคุณถ้าboolพระรามผ่านถูกยังคงประเมินและข้อยกเว้นจะถูกโยนในการเรียกร้องให้ ดังนั้นฉันจะเปลี่ยนบรรทัดสุดท้ายที่จะอ่าน: ซึ่งจะประเมินเฉพาะเมื่อไม่เป็นโมฆะ nulltypeof bool === 'object'TypeError: Cannot read property 'valueOf' of nulltypeof bool.valueOf()(typeof bool === 'object' && bool && typeof bool.valueOf() === 'boolean');bool
Al Dass

34

ด้วยJavaScript ที่บริสุทธิ์คุณสามารถใช้typeofและทำสิ่งที่ชอบtypeof falseหรือtypeof trueมันจะส่งคืน"boolean"...

แต่นั่นไม่ใช่วิธีเดียวที่จะทำอย่างนั้นฉันกำลังสร้างฟังก์ชั่นด้านล่างเพื่อแสดงวิธีการต่าง ๆ ที่คุณสามารถตรวจสอบบูลีนใน JavaScript และวิธีที่คุณสามารถทำได้ในเฟรมเวิร์กใหม่เริ่มด้วย:

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

หรือทางเดียวที่ES6 ...

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

และเรียกว่าชอบ!

isBoolean(false); //return true

นอกจากนี้ในUnderscoreซอร์สโค้ดพวกเขาตรวจสอบเช่นนี้ (ด้วย _. ที่จุดเริ่มต้นของชื่อฟังก์ชัน):

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คุณสามารถใช้บูลีนประเภท:

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. ทำการ overkill อย่างสมบูรณ์และไม่จำเป็นของการห่อหุ้มคลาสในแบบดั้งเดิม:

    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
ในที่สุดวิธีการทั้งสองก็ด่าอย่างรวดเร็วจำนวนความแตกต่างของ nanoseconds นั้นเล็กมากมันยากที่จะทดสอบแม้แต่วิธีที่เร็วกว่า นี่คือสองของ JSPerf หนึ่งกล่าวว่า!!เร็วขึ้นหนึ่งบอกว่าBooleanเร็วขึ้น เป็นเพียงการอ้างอิงถึงความแตกต่างเล็กน้อยระหว่างการทดสอบ การตรวจสอบบูลีนนั้นรวดเร็ว jsperf.com/bool-not-not jsperf.com/bool-vs-doublenot
iSkore

ฉันยอมรับว่าความแตกต่างนั้นไม่สามารถวัดได้และในกรณีเช่นนี้ความพร้อมในการอ่านควรจะเป็น AFAIK ก่อนเสมอ ดังนั้นมาตรฐานและความเข้าใจที่typeof val === "boolean"ดีที่สุด
m93a

1
ใช่ฉันเห็นด้วยกับที่ การอ่านเป็นสิ่งสำคัญ ผู้ประกอบการไม่สามารถอ่านได้ - จะอัปเดต
iSkore

16

คุณสามารถใช้จาวาสคริปต์ที่แท้จริงเพื่อให้บรรลุสิ่งนี้:

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 ไม่ถูกประกาศสำหรับฉัน
Dudi

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
รหัสไม่ได้สะอาดสวยหรือชัดเจน โปรดทราบว่า OP กำลังขอให้ "วิธีทำความสะอาดเพื่อให้ได้สิ่งนี้"
Spencer Wieczorek

ฉันยอมรับว่ารหัสไม่สะอาดหรือสวย แต่ AFAIK ไม่มีสวยและในเวลาเดียวกันก็มีตัวเลือกที่น่าเชื่อถือในกรณีที่ทั้งบูลีนดั้งเดิมและวัตถุบูลีนในที่เกิดเหตุ
Volodymyr Frolov

ดูเหมือนว่าเป็นวิธีแก้ปัญหาเกินจริงอย่างจริงจังที่จะทำสิ่งที่สามารถทำได้โดยกำเนิด
brandonscript

3

ฉันจะไปกับ Lodash: isBooleanตรวจสอบว่าตัวแปรpass -in เป็นวัตถุบูลีนดั้งเดิมหรือวัตถุห่อหุ้มบูลีนและบัญชีสำหรับทุกกรณี


1

คุณสามารถสร้างฟังก์ชั่นที่ตรวจสอบtypeofการโต้แย้ง

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

1

บางครั้งเราต้องการวิธีเดียวในการตรวจสอบ พิมพ์ไม่ได้ไปเดทเป็นต้นฉันเลยทำให้มันง่ายด้วย

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 - ทั้ง praticaly เดียวกัน) typeof v === 'booleanและtypeof v === typeof true(2) isBoolean(v), v === true || v === false(3)
jpenna

ฉันไม่เห็นด้วยกับสุดใจนี้ นิสัยที่แตกต่างกันเป็นเหตุผลที่แน่นอนว่าทำไม: ฉันมีข้อบกพร่องบ่อยแค่ไหนเพราะทุกคนตรวจสอบสิ่งต่างกัน? หากคุณมีที่เดียวที่จะตรวจสอบค่าบูลีนนั่นเป็น IMO ที่ดีกว่ามากสำหรับการตรวจสอบสไตล์ที่แตกต่างกันทั่ว codebase นอกจากนี้ยังง่ายกว่ามากในการเปลี่ยนพฤติกรรมของฟังก์ชั่นดังกล่าว
Lucas Manzke


1
  • อ่านได้มากที่สุด: val === false || val === true.
  • typeof variable == typeof trueนอกจากนี้ยังสามารถอ่านได้:
  • สั้นที่สุด แต่ไม่สามารถอ่านได้ทั้งหมด: !!val === val.

    คำอธิบาย:

    • [!!] เครื่องหมายอัศเจรีย์คู่แปลงค่าเป็นบูลีน
    • [===] การทดสอบสามเท่าสำหรับความเท่าเทียมที่เข้มงวด: ทั้งประเภท (บูลีน) และค่าจะต้องเหมือนกัน
    • หากค่าดั้งเดิมไม่ใช่ค่าบูลีนค่าจะไม่ผ่านการทดสอบเท่ากับสาม หากเป็นตัวแปรบูลีนมันจะผ่านการทดสอบสามเท่า (ทั้งประเภทและค่า)

    แบบทดสอบ:

    • !! 5 === 5 // false
    • !! 'test' === 'test' // false
    • ให้ val = new Date (); !! val === val // false
    • !! true === จริง // จริง
    • !! false === false // true

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

ผลตอบแทนบูลีนเป็นจริงเฉพาะในกรณีที่ค่าเป็นค่าบูลีน
Ratan Uday Kumar

0

อีกหนึ่งการตัดสินใจด้วยฟังก์ชั่นลูกศร es2015

const isBoolean = val => typeof val === 'boolean';
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.