Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Toán tử double tilde (~~) trong JavaScript

Định nghĩa

~~x áp dụng bitwise NOT (~) hai lần. Hiệu quả: cắt phần thập phân, làm tròn về 0 (giống Math.trunc()).

Cơ chế

~x = -(x + 1)
~~x = -(-(x + 1) + 1) = x (nếu x integer)
// Nếu x có phần thập phân: bitwise chuyển sang int32 trước → cắt phần thập phân

Ví dụ

<script>
var a = 2.7;
var b = ~~a;        // 2
var c = Math.floor(a); // 2
var d = ~~b === c;  // true
document.write(b + "<br>" + c + "<br>" + d);
</script>

So sánh với Math.floor / Math.trunc

Giá trị~~Math.floorMath.trunc
2.7222
-2.7-2-3-2
2.0222
1e200 (overflow!)1e201e20

⚠️ CẢNH BÁO: Giới hạn 32-bit

Bitwise chỉ hoạt động trên signed 32-bit integer (-2^31 đến 2^31-1).

~~2147483647  // 2147483647 (MAX_INT32)
~~2147483648  // -2147483648 (TRÀN!)
~~1e10        // 1410065408 (sai hoàn toàn)

Khuyến nghị

  • Không dùng ~~ trong production code – dễ bug tràn số, khó đọc.
  • Dùng Math.trunc() (ES2015) hoặc Math.floor() / Math.ceil() rõ ràng.
  • Chỉ dùng ~~ trong code golf, demo, hoặc tối ưu cực đoan (với kiểm soát range).