基礎知識:
某個數值的按位非操作,可以簡單的理解為該值取負值後減1 例如:
~5 = -5-1 = -6
~-5 = 5-1 = 4
~4 = -4-1 = -5
複製程式碼
原理:
二進位制數的負數是取該二進位制數的補碼,然後+1。
二進位制數,最高位為0表示正數,最高位為1表示負數。(最高位分不同情況儲存不一樣)
5的二進位制表示:00000101 (假設最高位為8位)
補碼:11111010 -5:11111011
~
按位非操作其實就是取補碼的過程,也就是上述求該值負數的逆過程,所以可以簡單的理解為該值取負值後減1。
5的補碼就是~5,那麼~5+1 = -5,所以~5 = -5-1 = -6
應用:
1、indexOf()
判斷陣列或者字串中是否存在某個元素,一般使用indexOf()如下:
if(str.indexOf(query) != -1) {}
if(str.indexOf(query) >= 0) {}
複製程式碼
現在可以更加清爽和高階的寫成:
if(~str.indexOf(query)) {}
複製程式碼
原理:
不存在返回-1,~-1 = 0 ,大於-1的值,0,1,2,3 ... 按位非的值1,2,3,4...都大於0
ps: 這種寫法可不僅僅的B格高這麼簡單,位運算相對於比較運算子效率高,對於一次運算本身來說,可能相差無幾,但在迴圈次數過大,比如超過了10000000次,效率就會有差距。
2、~~value
的使用
對於浮點數,~~value可以代替parseInt(value),而且前者效率更高些
parseInt(-2.99) //-2
~~(-2.99) //-2
複製程式碼
ps: 這些技巧可能會給閱讀程式碼的同學造成困擾,如果不知道原理的話,甚至讓人費解。因此平時寫程式碼的時候,要根據情況決定採用哪種寫法。