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

基礎知識:

某個數值的按位非操做,能夠簡單的理解爲該值取負值後減1 例如:數組

~5 = -5-1 = -6
~-5 = 5-1 = 4
~4 = -4-1 = -5
複製代碼

原理:

二進制數的負數是取該二進制數的補碼,而後+1。ui

二進制數,最高位爲0表示正數,最高位爲1表示負數。(最高位分不一樣狀況存儲不同)spa

5的二進制表示:00000101 (假設最高位爲8位)code

補碼:11111010 -5:11111011字符串

~按位非操做其實就是取補碼的過程,也就是上述求該值負數的逆過程,因此能夠簡單的理解爲該值取負值後減1。class

5的補碼就是~5,那麼~5+1 = -5,因此~5 = -5-1 = -6效率

應用:

一、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次,效率就會有差距。

二、~~value的使用

對於浮點數,~~value能夠代替parseInt(value),並且前者效率更高些

parseInt(-2.99) //-2 
~~(-2.99) //-2 
複製代碼

ps: 這些技巧可能會給閱讀代碼的同窗形成困擾,若是不知道原理的話,甚至讓人費解。所以平時寫代碼的時候,要根據狀況決定採用哪一種寫法。

相關文章
相關標籤/搜索