Đị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.floor | Math.trunc |
|---|---|---|---|
| 2.7 | 2 | 2 | 2 |
| -2.7 | -2 | -3 | -2 |
| 2.0 | 2 | 2 | 2 |
| 1e20 | 0 (overflow!) | 1e20 | 1e20 |
⚠️ 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ặcMath.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).