某個數值的按位非操做,能夠簡單的理解爲該值取負值後減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: 這些技巧可能會給閱讀代碼的同窗形成困擾,若是不知道原理的話,甚至讓人費解。所以平時寫代碼的時候,要根據狀況決定採用哪一種寫法。