ブール結果を数値/整数に変換します


276

falseまたはを格納する変数がありますが、それぞれまたはtrueが必要です。これどうやってするの?01


8
次に、提供されているいくつかの手法のパフォーマンス比較を示します。jsperf.com / conversion-from-boolean-to-number
Sam

4
Node.JSユーザーはbool === true ? 1 : 0、V8の中で最速であるため、を使用することを望みます。
Qix-モニカは2014年

3
またはただbool ? 1 : 0;
アトラハシス

回答:


343

JavaScriptには、使用できる3項演算子があります。

var i = result ? 1 : 0;

7
ベストアンサー。どうして?これは、より一般的であり、任意のタイプ(文字列、数値など)を受け入れる真実性に作用します。単項の答えは確かに賢いですが、文字列を渡すと、が返されますNaN。したがって、L33Tが必要で入力が保証されている場合は、尿道に行きます。
gdibble 2017年

466

オペランドを数値に変換する単項演算+子を使用します。

+ true; // 1
+ false; // 0

もちろん、クライアント側のコードの内容に関係なく、ユーザーはサーバーにデータを送信できるため、サーバー側でデータをサニタイズする必要があることに注意してください。


50
クールではありますが(私はこれを考えたことがありませんでした)、信じられないほど遅いです(正確には、Chromeでは97%遅い)。注意してください!
Qix-モニカは2014年

5
このリビジョンをチェックしてください。Number()さらに遅いです。
Qix-モニカは2014年

23
それが表示されますbool === true ? 1 : 0から、僅差で、最速ですbool | 0
Qix-モニカは2014年

1
乗算(例:3 * false)はとても気分が悪いですが、うまくいきます。:)ありがとう!
mattsoave

1
@DerkJanSpeelman Typescriptで許可されていないということは、JavaScriptで許可されていないということではありません。それらは(関連はありますが)異なる言語です。
lonesomeday

119

最高の解決策は次のとおりです。

fooBar | 0

これはasm.jsで整数型を強制するために使用されます。


最速の1つ。+1。
Qix-モニカは2014年

3
良いですね。また、 "ブール^ 0"を使用することもできます。ORまたはXORが機能します。
F8ER 2016

1fooBarがそうでない場合、これは整数を返しませんか?
ESR

58

Number関数を使用したい。オブジェクトを受け取り、それを数値に変換します。

例:

var myFalseBool = false;
var myTrueBool = true;

var myFalseInt = Number(myFalseBool);
console.log(myFalseInt === 0);

var myTrueInt = Number(myTrueBool);
console.log(myTrueInt === 1);

jsFiddleでテストできます。


3
これは断然最良の答えです。もちろん下に。「それはオブジェクトをとる」だけが正しくありません。
Rudie

2
MDNへのリンクは、はるかに優れてW3Schoolsのよりも(eeek!):developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Olivvv

読みやすく意図を明らかにするのに最適な方法だと思います。
Sam

3
また最も遅いです。
Qix-モニカは2014年

45

提案されたすべての回答のJSperf比較を作成しました。

TL; DR-現在のすべてのブラウザーに最適なオプションは次のとおりです。

val | 0;

更新:

最近はNumber()機能が最も遅いのを除いて、すべてがほぼ同じように見えますが、最高の状態val === true ? 1 : 0;です。


2
興味深いことに、MacOS 10.13.3上のChrome 64.0.3282で3成分が最も高速になりました。
2540625

当時はそれが最速の選択肢でしょう。それが最良の選択肢であることとは異なります。
mikemaccana

41

これを行う型付きの方法は次のとおりです。

Number(true) // 1
Number(false) // 0

2
最後にいくつかのまともな答え。ありがとう。
Erik Campobadal

30

今日私はこのショートカットに出くわしました。

~~(true)

~~(false)

私が説明できるよりもはるかに賢い人々:

http://james.padolsey.com/javascript/double-bitwise-not/


2
面白い。今日は新しいことを学びました。ただし、将来の私やチームメイトを混乱させる可能性があるため、この手法はどのプロジェクトでも使用しません。
nicholaides 2012年

1
hacky jsは私のお気に入りです。真剣に、+ 1
Todd

16

JavaScriptは数値を期待しているがブール値を受け取ると、そのブール値を数値に変換します。trueとfalseはそれぞれ1と0に変換します。したがって、これを利用できます。

var t = true;
var f = false;

console.log(t*1); // t*1 === 1
console.log(f*1); // f*1 === 0 

console.log(+t); // 0+t === 1 or shortened to +t === 1
console.log(+f); //0+f === 0 or shortened to +f === 0

さらに読むには、Javascriptの最も信頼できるガイドの3.8型変換の章を読んでください。


13

単項演算+子がこれを処理します。

var test = true;
// +test === 1
test = false;
// +test === 0

当然のことながら、保存する前にサーバーでこれをサニティチェックする必要があるので、とにかくこれを行う方が賢明な場所かもしれません。


コメントを===に変更しました。なぜならtrue == 1、「明示的な変換:-)がtrue === 1なくてもtrueになり、代わりにfalseになります
xanatos

13

私が書いていたいくつかのコードでこの問題を扱っていました。私の解決策は、ビット単位で使用することでした。

var j = bool & 1;

継続的な問題に対処するより迅速な方法は、関数を作成することです。他の人が読みやすくなり、メンテナンス段階で理解しやすくなり、何か間違ったことを書く可能性を取り除きます。

function toInt( val ) {
    return val & 1;
}

var j = toInt(bool);

編集-2014年9月10日

何らかの理由により、Chromeでは、同一の演算子と同じ3項演算子を使用した変換の方が高速です。なぜそれがより高速であるかについては意味がありませんが、途中のどこかで理にかなっているある種の低レベルの最適化だと思います。

var j = boolValue === true ? 1 : 0;

自分でテストします。 http //jsperf.com/boolean-int-conversion/2

FireFoxとInternet Explorerでは、一般的に私が投稿したバージョンを使用する方が高速です。

編集-2017年7月14日

さて、どちらを使用するべきか、または使用してはいけないかをお話しするつもりはありません。異常なブラウザはどれも、各メソッドで操作を実行できる速さで上下しています。ある時点でのChromeは、実際にはビットワイズとバージョンが他のバージョンよりも優れていましたが、それから突然大幅に悪化しました。彼らが何をしているのかわからないので、気になる人に任せます。このような操作がどれほど速く行われるかを気にする理由はほとんどありません。モバイル上でも、何もしない操作です。

また、これは、上書きできない「toInt」プロトタイプを追加するための新しいメソッドです。

Object.defineProperty(Boolean.prototype, "toInt", { value: function()
{
    return this & 1;
}});

この投稿には2つの反対票がありました。なぜ反対票を投じたのか説明しないでください。そうでなければ、それは正当な理由のない単なる反対票です。
ニコラスR.グラント

1
jsperfの結果の99倍は、時期尚早の最適化パスを導き、代わりに醜いSQLステートメントに集中する必要がある場合に、ループからナノ秒を最適化します。これにアプローチする
いくつかの

どのSQLステートメント?ここには単一のクエリはありません。JSPerfを参照している場合、他の誰かのテストからリンクしました。私のものではありません。これは何もしない操作なので、正直に言って、パフォーマンスの側面は気にしません。JSとほぼ同じ機能を備えた独自の言語を作成しました。intへのキャストは非常に高速な操作でした。プロトタイプチェーンを登るのはそうではありませんでした。そのため、コンパイラーによってインライン化できる単純な関数を使用して、私が最初に実行した方法をお勧めします。
ニコラスR.グラント

SQLのことは「一般化」です。洞察に感謝
RozzA 2017年

9

0を追加したり、シフト演算子またはxorを使用したりすることもできます。

val + 0;
val ^ 0;
val >> 0;
val >>> 0;
val << 0;

これらの速度は、他の回答の速度と同じです。


6

私のコンテキストでは、ブールから不透明度の値を取得するReact Nativeです。最も簡単な方法は、単項+演算子を使用することです。

+ true; // 1
+ false; // 0

これにより、ブール値が数値に変換されます。

style={ opacity: +!isFirstStep() }

4

ブールプロトタイプを拡張するだけでこれを行うことができます

Boolean.prototype.intval = function(){return ~~this}

何が起こっているのかを理解するのはそれほど簡単ではないので、代替バージョンは

Boolean.prototype.intval = function(){return (this == true)?1:0}

あなたができることをやったこと

document.write(true.intval());

ブール値を使用して条件を保存するとき、それらをビットフィールドに変換することがよくあります。その場合、プロトタイプ関数の拡張バージョンを使用することになります。

Boolean.prototype.intval = function(places)
{
 places = ('undefined' == typeof(places))?0:places; 
 return (~~this) << places
}

あなたができること

document.write(true.intval(2))

出力として4を生成します。




1

この例をすべてテストし、ベンチマークを行いました。最後に、短い方を選択することをお勧めします。パフォーマンスに影響はありません。

Ubuntuサーバー14.04、nodejs v8.12.0で実行-18/10/18

    let i = 0;
console.time("TRUE test1")
    i=0;
    for(;i<100000000;i=i+1){
        true ? 1 : 0;
    }
console.timeEnd("TRUE test1")


console.time("FALSE test2")
    i=0;
    for(;i<100000000;i=i+1){
        false ? 1 : 0;
    }
console.timeEnd("FALSE test2")

console.log("----------------------------")

console.time("TRUE test1.1")
    i=0;
    for(;i<100000000;i=i+1){
        true === true ? 1 : 0;
    }
console.timeEnd("TRUE test1.1")


console.time("FALSE test2.1")
    i=0;
    for(;i<100000000;i=i+1){
        false === true ? 1 : 0;
    }
console.timeEnd("FALSE test2.1")

console.log("----------------------------")

console.time("TRUE test3")
    i=0;
    for(;i<100000000;i=i+1){
        true | 0;
    }
console.timeEnd("TRUE test3")

console.time("FALSE test4")
    i=0;
    for(;i<100000000;i=i+1){
        false | 0;
    }
console.timeEnd("FALSE test4")

console.log("----------------------------")

console.time("TRUE test5")
    i=0;
    for(;i<100000000;i=i+1){
        true * 1;
    }
console.timeEnd("TRUE test5")

console.time("FALSE test6")
    i=0;
    for(;i<100000000;i=i+1){
        false * 1;
    }
console.timeEnd("FALSE test6")

console.log("----------------------------")

console.time("TRUE test7")
    i=0;
    for(;i<100000000;i=i+1){
        true & 1;
    }
console.timeEnd("TRUE test7")

console.time("FALSE test8")
    i=0;
    for(;i<100000000;i=i+1){
        false & 1;
    }
console.timeEnd("FALSE test8")

console.log("----------------------------")

console.time("TRUE test9")
    i=0;
    for(;i<100000000;i=i+1){
        +true;
    }
console.timeEnd("TRUE test9")

console.time("FALSE test10")
    i=0;
    for(;i<100000000;i=i+1){
        +false;
    }
console.timeEnd("FALSE test10")

console.log("----------------------------")

console.time("TRUE test9.1")
    i=0;
    for(;i<100000000;i=i+1){
        0+true;
    }
console.timeEnd("TRUE test9.1")

console.time("FALSE test10.1")
    i=0;
    for(;i<100000000;i=i+1){
        0+false;
    }
console.timeEnd("FALSE test10.1")

console.log("----------------------------")

console.time("TRUE test9.2")
    i=0;
    for(;i<100000000;i=i+1){
        -true*-1;
    }
console.timeEnd("TRUE test9.2")

console.time("FALSE test10.2")
    i=0;
    for(;i<100000000;i=i+1){
        -false*-1;
    }
console.timeEnd("FALSE test10.2")

console.log("----------------------------")

console.time("TRUE test9.3")
    i=0;
    for(;i<100000000;i=i+1){
        true-0;
    }
console.timeEnd("TRUE test9.3")

console.time("FALSE test10.3")
    i=0;
    for(;i<100000000;i=i+1){
        false-0;
    }
console.timeEnd("FALSE test10.3")

console.log("----------------------------")

console.time("TRUE test11")
    i=0;
    for(;i<100000000;i=i+1){
        Number(true);
    }
console.timeEnd("TRUE test11")

console.time("FALSE test12")
    i=0;
    for(;i<100000000;i=i+1){
        Number(false);
    }
console.timeEnd("FALSE test12")

console.log("----------------------------")

console.time("TRUE test13")
    i=0;
    for(;i<100000000;i=i+1){
        true + 0;
    }
console.timeEnd("TRUE test13")

console.time("FALSE test14")
    i=0;
    for(;i<100000000;i=i+1){
        false + 0;
    }
console.timeEnd("FALSE test14")

console.log("----------------------------")

console.time("TRUE test15")
    i=0;
    for(;i<100000000;i=i+1){
        true ^ 0;
    }
console.timeEnd("TRUE test15")

console.time("FALSE test16")
    i=0;
    for(;i<100000000;i=i+1){
        false ^ 0;
    }
console.timeEnd("FALSE test16")

console.log("----------------------------")

console.time("TRUE test17")
    i=0;
    for(;i<100000000;i=i+1){
        true ^ 0;
    }
console.timeEnd("TRUE test17")

console.time("FALSE test18")
    i=0;
    for(;i<100000000;i=i+1){
        false ^ 0;
    }
console.timeEnd("FALSE test18")

console.log("----------------------------")

console.time("TRUE test19")
    i=0;
    for(;i<100000000;i=i+1){
        true >> 0;
    }
console.timeEnd("TRUE test19")

console.time("FALSE test20")
    i=0;
    for(;i<100000000;i=i+1){
        false >> 0;
    }
console.timeEnd("FALSE test20")

console.log("----------------------------")

console.time("TRUE test21")
    i=0;
    for(;i<100000000;i=i+1){
        true >>> 0;
    }
console.timeEnd("TRUE test21")

console.time("FALSE test22")
    i=0;
    for(;i<100000000;i=i+1){
        false >>> 0;
    }
console.timeEnd("FALSE test22")

console.log("----------------------------")

console.time("TRUE test23")
    i=0;
    for(;i<100000000;i=i+1){
        true << 0;
    }
console.timeEnd("TRUE test23")

console.time("FALSE test24")
    i=0;
    for(;i<100000000;i=i+1){
        false << 0;
    }
console.timeEnd("FALSE test24")

console.log("----------------------------")

console.time("TRUE test25")
    i=0;
    for(;i<100000000;i=i+1){
        ~~true;
    }
console.timeEnd("TRUE test25")

console.time("FALSE test26")
    i=0;
    for(;i<100000000;i=i+1){
        ~~false;
    }
console.timeEnd("FALSE test26")

console.log("----------------------------")

console.time("TRUE test25.1")
    i=0;
    for(;i<100000000;i=i+1){
        ~true*-1-1;
    }
console.timeEnd("TRUE test25.1")

console.time("FALSE test26.1")
    i=0;
    for(;i<100000000;i=i+1){
        ~false*-1-1;
    }
console.timeEnd("FALSE test26.1")

console.log("----------------------------")

console.time("TRUE test27")
    i=0;
    for(;i<100000000;i=i+1){
        true/1;
    }
console.timeEnd("TRUE test27")

console.time("FALSE test28")
    i=0;
    for(;i<100000000;i=i+1){
        false/1;
    }
console.timeEnd("FALSE test28")

結果

TRUE test1: 93.301ms
FALSE test2: 102.854ms
----------------------------
TRUE test1.1: 118.979ms
FALSE test2.1: 119.061ms
----------------------------
TRUE test3: 97.265ms
FALSE test4: 108.389ms
----------------------------
TRUE test5: 85.854ms
FALSE test6: 87.449ms
----------------------------
TRUE test7: 83.126ms
FALSE test8: 84.992ms
----------------------------
TRUE test9: 99.683ms
FALSE test10: 87.080ms
----------------------------
TRUE test9.1: 85.587ms
FALSE test10.1: 86.050ms
----------------------------
TRUE test9.2: 85.883ms
FALSE test10.2: 89.066ms
----------------------------
TRUE test9.3: 86.722ms
FALSE test10.3: 85.187ms
----------------------------
TRUE test11: 86.245ms
FALSE test12: 85.808ms
----------------------------
TRUE test13: 84.192ms
FALSE test14: 84.173ms
----------------------------
TRUE test15: 81.575ms
FALSE test16: 81.699ms
----------------------------
TRUE test17: 81.979ms
FALSE test18: 81.599ms
----------------------------
TRUE test19: 81.578ms
FALSE test20: 81.452ms
----------------------------
TRUE test21: 115.886ms
FALSE test22: 88.935ms
----------------------------
TRUE test23: 82.077ms
FALSE test24: 81.822ms
----------------------------
TRUE test25: 81.904ms
FALSE test26: 82.371ms
----------------------------
TRUE test25.1: 82.319ms
FALSE test26.1: 96.648ms
----------------------------
TRUE test27: 89.943ms
FALSE test28: 83.646ms

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