如何检查类型是否为布尔值


268

如何检查变量的类型是否为布尔型?

我的意思是,有一些替代方法,例如:

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

但这对我来说似乎并不好。

有没有更清洁的方法来实现这一目标?


1
难道truefalse布尔类型?
Matias Cicero

1
您不需要检查,可以执行此操作!!( ... some expression ...),结果将是布尔值。
卡伦·林宁顿

1
否:true并且false是类型的基本体boolean。大写B布尔类型是布尔基元的对象包装类型。
尖尖的2015年

@CallumLinington不适用于使用布尔值构造函数创建的对象:)
2015年

1
@CallumLinington尝试:if (new Boolean(false)) alert("hi");-大写B布尔对象始终是“真实的”,而不管底层的little-b布尔值如何。
尖尖的2015年

Answers:


505

那就是为什么typeof。括号是可选的,因为它是一个运算符

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

7
目前尚不清楚OP打算做什么,但是大写的B布尔对象通过给出“对象”作为其类型typeof
尖尖的2015年

14
1)typeof不是功能。2)typeof不需要使用三元运算符=== ,因为它总是返回一个字符串(afaik,但据我所知,某些非常旧的浏览器还有另一种情况)。3)typeof和字符串比较慢。不要使用它们。直接检查(variable === true || variable === false)(我建议编写一个函数)。
StanE '16

6
会不会typeof(variable) === typeof(true)更强大?
Marcus Junius Brutus

2
@TusharNiras name是具有特殊getter 开发人员
。mozilla.org/ zh

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
在我看来,将布尔基元和布尔对象相同是不切实际的,因为无论如何我都不能以相同的方式使用它们。
Felix Kling

@FelixKling-对我来说似乎也不是很实用,但是OP似乎试图确定变量是否是布尔值,即使使用创建时new Boolean(),从技术上讲,它不是布尔值,而是对象,但仍然有效布尔值。
2015年

我认为OP只是不知道会new Boolean()返回一个对象(请参阅问题注释)。但无论如何:)
费利克斯·克林

@FelixKling-重新阅读问题和评论,我现在看到OP基本上正在尝试做,typeof variable === typeof new Boolean()并且可能只想进行常规的typeof检查,但是却以某种奇怪的jQuery语法陷入困境。
2015年

根据您想如何弹性使你的代码,如果bool在通过PARAM是nulltypeof bool === 'object'会还在评估和TypeError: Cannot read property 'valueOf' of null例外将在电话会议上抛出typeof 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,则还可以使用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)应返回false(因为引用不同)。这就是为什么isBoolean(new Boolean(true))遗嘱必须为true时会说false(类型为boolean)的原因。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个比较。这是typeof
iSkore

1
毕竟,任何一种方法都是如此之快,纳秒级的差异是如此之小,甚至很难测试出哪一种更快。这是两个JSPerf。一说!!更快,一说Boolean更快。只是测试之间的差异量的参考。布尔检查很快。 jsperf.com/bool-not-not jsperf.com/bool-vs-doublenot
iSkore

我同意这种差异是无法衡量的,在这种情况下,应使AFAIK始终保持第一的可读性。因此,标准的和可理解的typeof val === "boolean"是最佳的。
m93a

1
是的,我同意这一点。可读性很重要。运营商不太可读-会更新
iSkore

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"如果值确实是一个对象,为什么要返回?对我来说,这似乎不太实用。无论如何,布尔对象必须与布尔基元以不同的方式处理。
Felix Kling

1
代码不是干净,漂亮或清晰的。请注意,OP正在寻求“更干净的方法来实现这一目标”。
Spencer Wieczorek'3

我同意代码不是干净或漂亮的,但是AFAIK没有漂亮且同时可靠的选项,以防在场景中同时存在布尔基元和布尔对象。
Volodymyr Frolov

这似乎是一个严重的过分解决方案,无法完成本来可以做的事情。
brandonscript


1

您可以创建一个检查typeof参数的函数。

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

1

有时我们需要一种方法来检查它。typeof不能用于日期等。所以我很容易

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

也为NumberStringBoolean等我们经常需要检查的类型在一个单一的方式...


1

从长远来看,创建isBoolean包含oneliner之类的函数typeof v === "boolean"似乎非常不便。我很惊讶几乎每个人都建议创建自己的功能。似乎与扩展原生原型一样是癌症。

  • 您需要在涉及的每个项目中重新创建它们
  • 其他开发人员可能有不同的习惯,或者需要检查功能的来源以查看使用哪种检查支票,以了解检查的弱点是什么
  • 当您尝试在现场的控制台中编写一个不属于您的项目的衬垫时,您会感到沮丧

只是记住而已typeof v === "boolean"。在您的IDE中添加一个模板,使其能够通过三个字母的快捷方式放入其中并感到高兴。


1
顺便说一句,如果性能非常重要,那么在我的测试中,具有用于检查布尔值的函数的时间要比在Node.js上进行内联(for循环100000000x)花费的时间多10%。但是最差的选择是v === true || v === false,如果发生2次验证false。排名:(1-实际上都相同)typeof v === 'booleantypeof v === typeof true,(2)isBoolean(v),(3)v === true || v === false
jpenna

我全心不同意。不同的习惯是造成这种情况的确切原因:由于每个人对事物的检查方式不同,所以我经常遇到错误?如果您有一个地方可以检查布尔值,那么与整个代码库中不同样式的检查相比,IMO更为可取。一致地更改这种功能的行为也容易得多。
Lucas Manzke

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 //否
    • !!'test'==='test'//否
    • let val = new Date(); !! val === val //否
    • !! 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

布尔值仅当值是布尔值时才返回true
Ratan Uday Kumar,

0

es2015箭头功能的另一个决定

const isBoolean = val => typeof val === 'boolean';
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.