我在咖啡脚本的小书中找到了这个
!!~ string.indexOf "test"
我测试
~-1 == 0
~0 == -1
~3 == -4
~-2 == 1
那么这里到底发生了什么以及为什么返回,~
是0
唯一产生的价值吗?-1
-1
0
我在咖啡脚本的小书中找到了这个
!!~ string.indexOf "test"
我测试
~-1 == 0
~0 == -1
~3 == -4
~-2 == 1
那么这里到底发生了什么以及为什么返回,~
是0
唯一产生的价值吗?-1
-1
0
In two's complement integers, -1 is a sequence of all 1-bits. The ~
bitwise operator:
Inverts the bits of its operand.
Inverting the bits in a sequence of 1-bits gives you a sequence of 0-bits and a sequence of 0-bits is the integer 0. So ~i
is zero if and only if i === -1
.
[...] returns -1 if the value is not found
Putting those two things together tells us that this:
~ string.indexOf "test"
is zero if and only if "test"
is not present in string
. Then we add the !!
"cast to boolean" trick and the fact that 0
is the only integer that is falsey in JavaScript and we have:
!!~ string.indexOf "test"
being true
if "test"
appears in string
and false
otherwise; or, in sensible and readable code, that's the same as:
string.indexOf("test") != -1
If the book is actually suggesting that you write code like that then you should burn that book and find a better one. Using all that bit twiddling is just the sort of "cleverness" that will make everyone maintaining your code hate you.