js中 ~(按位非)運算子妙用

weixin_33686714發表於2018-11-20

基礎知識:

某個數值的按位非操作,可以簡單的理解為該值取負值後減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: 這些技巧可能會給閱讀程式碼的同學造成困擾,如果不知道原理的話,甚至讓人費解。因此平時寫程式碼的時候,要根據情況決定採用哪種寫法。

相關文章