JS 雙波浪符(~~)

JavaScript NOT 運算符在實際場景的運用案例

-3 min read

關聯: [[JavaScript]]

雙 NOT 運算符(~~)使用在數字上,結果相當於 Math.trunc()

console.log(~~-1) // -1console.log(Math.trunc(-1))// -1console.log(~~0) // 0console.log(Math.trunc(0)) // 0console.log(~~1) // 1console.log(Math.trunc(1)) // 1console.log(~~'-1') // -1console.log(Math.trunc('-1'))// -1console.log(~~'0') // 0console.log(Math.trunc('0')) // 0console.log(~~2.4) // 2console.log(Math.trunc(2.4)) // 2console.log(~~3.9) // 3console.log(Math.trunc(3.9)) // 3

優點

  • 效能有一點點點點優於 Math.trunc(),因為 JS 數學運算的底層,會轉換為位元運算,~~ 是直接使用位元運算,故效率更好
  • 寫起來快速簡單,~~ 即可

缺點

  • 可讀性低

範例

補充: Vue SFC Playground 用此來計算拖曳視窗的寬度比例,永遠不會出現小數點,藉此將拖曳的觸發範圍拉大(拉的範圍超過整數,才會作動)而不這麼敏感。
function dragMove(e: MouseEvent) {  if (state.dragging) {    const position = isVertical.value ? e.pageY : e.pageX    const totalSize = isVertical.value      ? container.value.offsetHeight      : container.value.offsetWidth    const dp = position - startPosition    state.split = startSplit + ~~((dp / totalSize) * 100) // this line  }}

有小數點的拖曳

可以看到需要拖曳的距離只拉一點點,畫面就會跟著拖曳,靈敏度較高

沒有小數點的拖曳

可以看到需要拖曳的距離需要拉多一點,畫面才會跟著拖曳

參考文章