~:位元非操作符由一個波浪線(~)表示,執行位元非的結果就是傳回數值的反碼。
var num1 = 3; 3
var num2 = ~(num1);
console.log(num2) // "-4"
var num3 = -3;
var num4 = ~(num3);
console.log(num4) // "2"
console.log(~(0)) // "-1"
沒錯,現在我們知道了~運算子的原理了。開心嗎? 。 。 。不開心,雖然這一章,我看過好多次。 。 。因為我從來就沒用過,實在是慚愧啊。大家覺得這個運算子可以用在什麼地方呢?恩。 。 。沉思一下,放同事的程式碼:
if~ item[search_key].toLowerCase().indexOf(query)) {
🎜>
複製程式碼
原理分析:
透過str.indexOf(query)最後得出的值,無外乎不過兩種:
1. str中包含query字串,則值是0或正整數,此時:!!(~str.indexOf(query)) === true(或這樣轉換Boolean(~str.indexOf(query)) === true)
2 . srt中不包含query字串,則值為-1,此時:!!(~str.indexOf(query)) === false
因此透過加上一個~就能很好的對indexOf的查詢結果進行判斷了。清爽無比,從此再也沒有頭皮屑的煩惱了。 。哈哈!
最後我們來分析一下效率吧,印像中位數運算的效率應該比較運算子高。來段程式碼:
複製程式碼
timeStart1 = new Date() - 0;
for(var i = 000 i00000 i000; ) {
~str.indexOf(query)
}
var timeEnd1 = new Date() - 0;
var timeEnd1 = new Date() - 0;
長度為 . 🎜> // ~ cost time:9954 循環次數:10000000
// ~ cost time:104 循環次數:100000
j str.indexOf(query) >= 0
}
var timeEnd2 = new Date) -
var timeEnd2 = new Date) - // >= cost time:10120 循環次數:10000000
程式更新:原先的測試程式碼在分割線上面不變。程式碼如下:
複製程式碼