値を配列に入れ、項目が配列にあるかどうかを確認します。
if ([1, 2, 3, 4].includes(test.type)) {
// Do something
}
サポートしているブラウザにArray#includes
メソッドがない場合は、このポリフィルを使用できます。
~
チルダショートカットの簡単な説明:
アップデート:私たちが今持っているのでincludes
方法を、使用にはポイントがない~
ハックはもう。それがどのように機能するかを知ることに興味がある、および/または他のコードでそれに遭遇した人のために、これをここに保持してください。
代わりに結果がかどうかをチェックするのindexOf
で>= 0
、ちょっといいのショートカットがあります:
if ( ~[1, 2, 3, 4].indexOf(test.type) ) {
// Do something
}
ここにフィドルがあります:http : //jsfiddle.net/HYJvK/
これはどのように作動しますか?配列でアイテムが見つかった場合は、indexOf
そのインデックスを返します。アイテムが見つからなかった場合は、が返され-1
ます。詳細に触れずに、~
はビットごとのNOT演算子であり、0
に対してのみ返され-1
ます。
~
戻り値を比較するよりも簡潔なので、ショートカットを使用するのが好きです。JavaScriptにin_array
ブール値を直接返す関数(PHPと同様)があればいいのにと思っていますが、それはあくまでも希望的なものです(更新:現在はそうです。と呼ばれていincludes
ます。上記参照)。jQueryはinArray
、PHPのメソッドシグネチャを共有しながら、実際にはネイティブindexOf
機能を模倣していることに注意してください(これは、インデックスが本当に必要な場合に、さまざまなケースで役立ちます)。
重要な注意:ティルデショートカットを使用すると、コードが十分に明確ではなく、すべての犠牲を払って回避すべきであると激しく信じているため、論争の渦中になっているようです(この回答のコメントを参照)。あなたが彼らの感情を共有するなら、あなたは.indexOf(...) >= 0
解決策に固執するべきです。
もう少し長い説明:
JavaScriptの整数は符号付きです。つまり、左端のビットは符号ビットとして予約されています。数値が正であるか負であるかを示すフラグ1
。
32ビットのバイナリ形式の正の数の例を次に示します。
1 : 00000000000000000000000000000001
2 : 00000000000000000000000000000010
3 : 00000000000000000000000000000011
15: 00000000000000000000000000001111
ここに同じ数字がありますが、負です:
-1 : 11111111111111111111111111111111
-2 : 11111111111111111111111111111110
-3 : 11111111111111111111111111111101
-15: 11111111111111111111111111110001
なぜ負の数のこのような奇妙な組み合わせですか?シンプル。負の数は正の数の逆数+ 1です。負の数を正の数に加算すると、常にが生成され0
ます。
これを理解するために、簡単な2進算術を実行してみましょう。
以下に追加-1
する方法を示します+1
。
00000000000000000000000000000001 +1
+ 11111111111111111111111111111111 -1
-------------------------------------------
= 00000000000000000000000000000000 0
そして、これは私たちがどのように追加-15
するか+15
です:
00000000000000000000000000001111 +15
+ 11111111111111111111111111110001 -15
--------------------------------------------
= 00000000000000000000000000000000 0
どのようにしてそれらの結果を得るのですか?定期的に足し算を行うことで、学校で教えられたように、一番右の列から始めて、すべての行を足します。合計が最大の1桁の数値(10進数では9
ですが、2進数では1
)より大きい場合、残りを次の列に繰り越します。
ここで、お気づきのように、負の数を正の数に追加すると、すべて0
のであるとは限らない右端の列には常に2つ1
のがあり、合計するとになり2
ます。2のバイナリ表現はなので、次の列10
にを運び、結果の1
a 0
を最初の列に入れます。左にある他のすべての列には、行が1つだけある1
ため、1
前の列から繰り越された値は再び合計され2
、次に繰り越されます...このプロセスは、左端の列に到達するまで繰り返されます。1
引き継がれるために、それがオーバーフローすると失われるので、行き場がない、と私たちはを残している0
すべてにわたって秒。
このシステムは2の補数と呼ばれます。あなたはここでこれについてもっと読むことができます:
符号付き整数の2の補数表現。
2の補数のクラッシュコース-1
が終了したので、2進数表現が1
全体に渡る唯一の数値であることがわかります。
~
ビット単位のNOT演算子を使用すると、指定された数値のすべてのビットが反転されます。0
すべてのビットを反転させることから戻る唯一の方法は、すべてので始めた場合1
です。
だから、このすべてはそれが言っての長ったらしい方法だった~n
だけ返され0
た場合n
です-1
。
in
ますか?