タイプがブールかどうかを確認する方法


269

変数の型がブール型かどうかを確認するにはどうすればよいですか?

つまり、次のような代替案があります。

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

しかし、それは私にはかなり思えません。

これを達成するためのより明確な方法はありますか?


1
ブール型ではありませんtruefalse
Matias Cicero

1
チェックする必要はありません!!( ... some expression ...)。これを行うことができ、結果はブール値になります。
Callum Linington

1
いいえ:trueおよびfalseタイプのプリミティブですboolean。Capital-Bブール型は、ブールプリミティブのオブジェクトラッパー型です。
Pointy

@CallumLiningtonは、ブールコンストラクターで作成されたオブジェクトでは機能しません:)
Pointy

1
@CallumLiningtonの試み:if (new Boolean(false)) alert("hi");-基になるlittle-bブール値に関係なく、資本Bブールオブジェクトは常に「真実」です。
とがった2015

回答:


506

それtypeofが目的です。括弧は演算子であるため、オプションです。

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

7
OPが何をしようとしているのかは明らかではありませんが、大文字のBブールオブジェクトは、型を介して「オブジェクト」をを通じて提供しtypeofます。
Pointy

14
1)typeof機能ではありません。2)トリプル演算子===を使用するtypeofと、常に文字列が返されるため、必要ありません(afaikですが、私の知る限り、一部の非常に古いブラウザでは別のケースがありました)。3)typeofそして文字列の比較は遅いです。それらを使用しないでください。直接確認してください(variable === true || variable === false)(関数を書くことをお勧めします)。
StanE

6
typeof(variable) === typeof(true)より堅牢になりませんか?
Marcus Junius Brutus

2
@TusharNiras nameは特別なゲッター developer.mozilla.org/en-US/docs/Web/API/Window/nameを
Zach Lysobey

1
@MarcusJuniusBrutus @AmitJokiナンセンスtypeof trueです"boolean"。代わりに冗長を使用しても利点はありません。新しいバージョンのECMAScriptには、重大な変更はありません。
m93a

40

プリミティブ値を確認したいだけの場合

typeof variable === 'boolean'

奇妙な理由でコンストラクターで作成されたブール値がある場合、それらは実際にはブール値ではなく、プリミティブブール値を含むオブジェクトであり、プリミティブブール値とで作成されたオブジェクトの両方をチェックする1つの方法new Booleanは、

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


2
ブールプリミティブとブールオブジェクトを同じように扱うことは、私にはあまり実用的ではないように思えます。なぜなら、私はとにかく同じように使用することができないからです。
Felix Kling、2015年

@FelixKling-私にとってもあまり実用的ではないようですが、OPは変数がブール値であるかどうかを判断しようとしているようです。これは、技術的にはブール値でnew Boolean()はなくオブジェクトですが、まだ保持されていますブール値。
adeneo

OPがnew Boolean()オブジェクトを返すことを知らなかったと思います(質問のコメントを参照)。しかし、何でも:)
Felix Kling

@FelixKling-質問とコメントをもう一度読んでください。OPが基本的に実行しようとしているtypeof variable === typeof new Boolean()ので、通常は通常のtypeofチェックが必要ですが、代わりに奇妙なjQuery構文に巻き込まれました。
adeneo 2015年

場合は、あなたのコードを作成する方法弾力性に応じて、boolparamは、渡されたことだったまだ評価されますと、例外がへの呼び出しにスローされます。したがって、最後の行を読み取りに変更します。これは、がnull でない場合にのみ評価されます。nulltypeof bool === 'object'TypeError: Cannot read property 'valueOf' of nulltypeof bool.valueOf()(typeof bool === 'object' && bool && typeof bool.valueOf() === 'boolean');bool
アルダス2017

34

純粋なJavaScriptを、あなたは、単に使用することができるtypeofなど何かをするtypeof falsetypeof true、それが返されます"boolean"...

しかし、これが唯一の方法ではありません。JavaScriptブール値をチェックするさまざまな方法、およびいくつかの新しいフレームワークでそれを行うさまざまな方法を示すために、以下の関数を作成します。これから始めましょう。

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

または、1行のES6方法...

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

そしてそれを好きなように呼んでください!

isBoolean(false); //return true

また、アンダースコアのソースコードでは、次のようにチェックします(関数名の先頭に_。を付けます)。

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)falseを返す必要があります(参照が異なるため)。だからこそ、isBoolean(new Boolean(true))と言うだろうそれがなければなりませんしながら、new Boolean(true)型であるブール値)。
AlexMelw

17

jQueryの有無にかかわらずこれをチェックするための3つの「バニラ」方法があります。

  1. 最初に、強制によるブール評価を強制し、次にそれが元の値と等しいかどうかを確認します。

    function isBoolean( n ) {
        return !!n === n;
    }
  2. 簡単なtypeofチェックを行う:

    function isBoolean( n ) {
        return typeof n === 'boolean';
    }
  3. プリミティブでクラスラッパーを完全に過剰にして不要なインスタンス化を行う:

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

3番目は、クラスを作成してそれを渡した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比較が実行されます。最初の2つの比較は強制ステップ中です。最後の比較は最初の位置(現在はプリミティブ)に対するものです。行うことtypeofも1つの強制ですが、typeofメソッドは最後の数回のゲッターと内部での比較+ 1つの比較を行います。これがV8のリファレンスですtypeof
iSkore

1
結局のところ、どちらの方法も非常に高速であり、ナノ秒単位の差は非常に小さいため、どちらが高速であるかをテストすることも困難です。ここに2つのJSPerfがあります。1つ!!はより速く言う、1つBooleanはより速く言う。テスト間のデルタがどれだけ小さいかを参照するだけです。ブール値のチェックは高速です。 jsperf.com/bool-not-not jsperf.com/bool-vs-doublenot
iSkore

違いは測定できないので、そのような場合は、AFAIKを常に最初に実行する必要があります。したがって、標準的でわかりやすいものtypeof val === "boolean"が最適です。
m93a

1
はい、同意します。読みやすさが重要です。演算子は読み
にくいです

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は私には宣言されていません。
Dudi 2017

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 truereturnが"boolean"whileをtypeof new Boolean(true)返すため"object"です。


"boolean"値が実際にオブジェクトである場合、なぜ戻りたいのですか?それは私にはあまり実用的ではないようです。ブールオブジェクトはブールプリミティブとは異なる方法で処理する必要があります。
Felix Kling 2015年

1
コードは、きれいでも、きれいでも、明確でもありません。OPが「これを達成するためのよりクリーンな方法」を求めていることに注意してください。
Spencer Wieczorek 2015年

私はコードがきれいでもきれいでもないことに同意しますが、AFAIKには、シーンにブールプリミティブとブールオブジェクトの両方がある場合、かなり同時に信頼できるオプションはありません。
Volodymyr Frolov

これは、ネイティブで実行できる何かを実行するための深刻な過剰ソリューションのようです。
ブランドンスクリプト、2015年


1

をチェックする関数を作成できます typeof引数。

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

1

時々、それをチェックする単一の方法が必要です。typeofは日付などでは機能しません。

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

またためNumberStringBooleanなど私たちはしばしば、単一の方法で、種類を確認する必要があります...


1

isBooleanonelinerを含むような関数を作成することはtypeof v === "boolean"、長期的には非常に不便です。ほとんどの人が独自の関数を作成することを提案していることに驚いています。原型のプロトタイプを拡張するのと同じ癌のようです。

  • 関与するすべてのプロジェクトでそれらを再作成する必要があります
  • 他の開発者は異なる習慣を持っているか、または関数のソースをチェックして、使用するチェックの実装を確認し、チェックの弱点を知る必要がある場合があります。
  • プロジェクトに属さないサイトのコンソールでライナーを1つ作成しようとすると、苛立ちます

ただ覚えておいてくださいtypeof v === "boolean"。テンプレートをIDEに追加すると、3文字のショートカットでテンプレートを配置して幸せになれます。


1
ちなみに、パフォーマンスが非常に重要である場合、ブール値をチェックする関数を使用すると、Node.jsでインライン(forループ100000000x)を実行するよりもテストで10%多く時間がかかりました。しかし、最悪のオプションはv === true || v === false、の場合に2つの検証を実行することでしたfalse。ランキング:(1-どちらも実用上同じ)typeof v === 'booleanおよびtypeof v === typeof true、(2)isBoolean(v)、(3)v === true || v === false
jpenna

私はこれに心から反対します。理由はさまざまですが、正確な理由は次のとおりです。すべての人が異なる方法でチェックしたため、バグをどれくらいの頻度で経験しましたか?ブール値をチェックする場所が1つある場合は、コードベース全体で異なるスタイルのチェックを行うよりも、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 // false
    • !! 'test' === 'test' // false
    • let val = new Date(); !! val === val // false
    • !! true === true // 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

値がブール値の場合にのみブール値がtrueを返す
Ratan Uday Kumar

0

es2015アロー関数によるもう1つの決定

const isBoolean = val => typeof val === 'boolean';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.