false
またはを格納する変数がありますが、それぞれまたはtrue
が必要です。これどうやってするの?0
1
bool === true ? 1 : 0
、V8の中で最速であるため、を使用することを望みます。
bool ? 1 : 0;
false
またはを格納する変数がありますが、それぞれまたはtrue
が必要です。これどうやってするの?0
1
bool === true ? 1 : 0
、V8の中で最速であるため、を使用することを望みます。
bool ? 1 : 0;
回答:
JavaScriptには、使用できる3項演算子があります。
var i = result ? 1 : 0;
NaN
。したがって、L33Tが必要で入力が保証されている場合は、尿道に行きます。
オペランドを数値に変換する単項演算+
子を使用します。
+ true; // 1
+ false; // 0
もちろん、クライアント側のコードの内容に関係なく、ユーザーはサーバーにデータを送信できるため、サーバー側でデータをサニタイズする必要があることに注意してください。
Number()
さらに遅いです。
bool === true ? 1 : 0
から、僅差で、最速ですbool | 0
。
最高の解決策は次のとおりです。
fooBar | 0
これはasm.jsで整数型を強制するために使用されます。
1
fooBarがそうでない場合、これは整数を返しませんか?
Number関数を使用したい。オブジェクトを受け取り、それを数値に変換します。
例:
var myFalseBool = false;
var myTrueBool = true;
var myFalseInt = Number(myFalseBool);
console.log(myFalseInt === 0);
var myTrueInt = Number(myTrueBool);
console.log(myTrueInt === 1);
jsFiddleでテストできます。
提案されたすべての回答のJSperf比較を作成しました。
TL; DR-現在のすべてのブラウザーに最適なオプションは次のとおりです。
val | 0;
。
更新:
最近はNumber()
機能が最も遅いのを除いて、すべてがほぼ同じように見えますが、最高の状態val === true ? 1 : 0;
です。
今日私はこのショートカットに出くわしました。
~~(true)
~~(false)
私が説明できるよりもはるかに賢い人々:
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型変換の章を読んでください。
単項演算+
子がこれを処理します。
var test = true;
// +test === 1
test = false;
// +test === 0
当然のことながら、保存する前にサーバーでこれをサニティチェックする必要があるので、とにかくこれを行う方が賢明な場所かもしれません。
===
に変更しました。なぜならtrue == 1
、「明示的な変換:-)がtrue === 1
なくてもtrueになり、代わりにfalseになります
私が書いていたいくつかのコードでこの問題を扱っていました。私の解決策は、ビット単位で使用することでした。
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;
}});
ブールプロトタイプを拡張するだけでこれを行うことができます
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を生成します。
この例をすべてテストし、ベンチマークを行いました。最後に、短い方を選択することをお勧めします。パフォーマンスに影響はありません。
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
整数x値が必要な場合、1から0に変更し、0から1に変更すると、(x + 1)%2を使用できます。