Menyingkap Sifat Sebenar Double Tilters (~~) dalam JavaScript
Dalam bidang JavaScript, pengendali menonjol dengan fungsi misterinya. Umum mengetahui bahawa tilde tunggal (~) menandakan BUKAN bitwise, membuatkan kita terfikir: apakah yang dicapai oleh doublettnya ()?
Bertentangan dengan gerak hati bahawa ia menggandakan penolakan bitwise, pengendali ~~ mempunyai kesan yang mengejutkan. Ia mempunyai keupayaan untuk memotong bahagian perpuluhan nombor, dengan berkesan membundarkannya ke arah nombor bulat terdekat.
Di sebalik tabir, operator ~~ beroperasi dengan menganggap operannya sebagai integer 32-bit yang ditandatangani, melakukan operasi bitwise tanpa mengira jenis sebenar operan (nombor, rentetan, dll.). Akibatnya, bahagian pecahan dibuang, dan hasilnya sentiasa nombor.
Tepatnya, pengendali ~~ pada dasarnya mensimulasikan fungsi berikut:
function truncate(x) { if(x < 0) return Math.ceil(x); else return Math.floor(x); }
Walau bagaimanapun, operasi ini memegang benar hanya jika nilai x berada dalam julat -(2^31) hingga 2^31 - 1, inklusif. Di luar julat ini, limpahan mungkin berlaku, membawa kepada hasil yang tidak dapat diramalkan.
Walaupun ~~ boleh berguna untuk menukar hujah rentetan dengan pantas kepada nombor, batasannya (kemungkinan limpahan dan kelakuan tidak betul untuk nilai bukan integer) menjadikan ia kurang diingini untuk manipulasi berangka. Sebaliknya, lebih baik menggunakan x atau Nombor(x) untuk tujuan ini.
Mentafsir Penolakan Berganda
Memahami operator ~~ kerana penolakan penolakan memerlukan menyelam lebih mendalam ke dalam perwakilan binari. Ambil nombor -43.2 sebagai contoh, diwakili dalam bentuk binari 32-bit yang ditandatangani (dua pelengkap):
-43.2<sub>10</sub> = 11111111111111111111111111010101<sub>2</sub>
Menyongsangkan semua bit (bitwise NOT) menghasilkan:
NOT -43<sub>10</sub> = 00000000000000000000000000101010<sub>2</sub> = 42<sub>10</sub>
Menerapkan penolakan sekali lagi menghasilkan:
NOT 42<sub>10</sub> = 11111111111111111111111111010101<sub>2</sub> = -43<sub>10</sub>
Keputusan akhir (-43) ini berbeza daripada keputusan Math.floor(-43.2), iaitu -44. Ini kerana ~~ membundarkan nombor daripada sifar, tidak seperti Math.floor, yang membundar ke bawah.
Atas ialah kandungan terperinci ## Apakah yang Sebenarnya Dilakukan oleh Pengendali Tilde Berganda (~~) dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!