1

私はこれをcoffeescriptの小さな本で見つけました

!!~ string.indexOf "test"

そして私はテストします

~-1 == 0
~0  == -1
~3 == -4
~-2 == 1

では、ここで正確に何が起こっていて、なぜ が返さ~れる0のか、生成される値は だけなのでしょうか?-1-10

4

1 に答える 1

3

2の補数の整数では、-1 はすべて 1 ビットのシーケンスです。~ビット演算子:

オペランドのビットを反転します。

1 ビットのシーケンスのビットを反転すると、0 ビットのシーケンスが得られ、0 ビットのシーケンスは整数 0 に~iなりi === -1ます。

String#indexOf:

[...] 値が見つからない場合は -1 を返します

これら 2 つのことをまとめると、次のことがわかります。

~ string.indexOf "test"

"test"がに存在しない場合に限り、ゼロですstring。次に、!!「ブール値にキャストする」というトリックと、それ0が JavaScript で falsey である唯一の整数であるという事実を追加すると、次のようになります。

!!~ string.indexOf "test"

およびそうでないtrue場合"test"に表示されます。または、賢明で読みやすいコードでは、次と同じです。stringfalse

string.indexOf("test") != -1

本が実際にそのようなコードを書くことを示唆している場合は、その本を燃やして、より良い本を見つける必要があります. ちょっとしたいじりをすべて使用することは、コードを維持しているすべての人があなたを嫌うような「賢さ」にすぎません。

于 2013-09-05T18:29:21.430 に答える