Objek Math dalam JavaScript adalah peralatan utiliti yang tidak menonjol dalam bahasa ini. Anda tidak pernah mencipta instansnya. Anda tidak pernah mengimportnya. Ia wujud begitu sahaja dalam setiap runtime, bersedia untuk mengendalikan segala-galanya daripada membundarkan nilai piksel sehinggalah menjana balingan dadu rawak. Oleh kerana Math adalah objek statik, setiap kaedah dan sifatnya tergantung terus pada namespace. Anda menulis Math.PI, bukan new Math().PI. Pilihan reka bentuk ini memastikan segalanya kekal ringkas, tetapi ia juga bermakna objek ini mempunyai beberapa kekurangan yang perlu difahami sebelum anda bergantung kepadanya untuk logik pengeluaran (production).
Objek Statik Tanpa Pembina (Constructor)
Kebanyakan objek JavaScript terbina dalam mahu anda mencipta satu instans. Anda memanggil new Date() atau new Array(). Math menolaknya. Ia direka sebagai namespace bagi fungsi dan pemalar berkaitan yang beroperasi pada jenis Number primitif. Panggil Math.sqrt(16) dan anda akan mendapat 4. Cuba gunakan kata kunci new dan enjin akan melontarkan TypeError. Corak ini memastikan memori kekal bersih dan menandakan bahawa Math adalah bersifat fungsi sepenuhnya. Ia menerima input, mengembalikan output, dan tidak mengubah apa-apa.
Terdapat satu had ketat yang perlu diingat: Math berfungsi dengan nombor standard IEEE 754. Ia tidak berfungsi dengan BigInt. Masukkan BigInt ke dalam Math.round() atau Math.abs() dan anda akan mendapat TypeError. Jika aplikasi anda berurusan dengan integer 64-bit atau lebih besar, anda perlu menukarkannya ke bawah atau mengendalikan aritmetik tersebut dengan operator BigInt asli sebagai ganti.
Pemalar yang Anda Gunakan
Objek Math mendedahkan beberapa pemalar numerik yang menyelamatkan anda daripada menulis nombor ajaib (magic numbers) secara keras (hard-coding).
Math.PIadalah nilai 3.14159... yang biasa kita ketahui, penting untuk apa sahaja yang melibatkan bulatan, trigonometri, atau penukaran darjah kepada radian.Math.Eadalah nombor Euler, kira-kira 2.718. Ia muncul dalam lengkung pertumbuhan eksponen, pengiraan faedah kompaun, dan skala logaritma.Math.SQRT2adalah punca kuasa dua dua, kira-kira 1.414. Ia berguna apabila anda memerlukan pepenjuru sebuah segi empat sama atau ingin menormalkan vektor dalam geometri ringkas.Math.LN2adalah logaritma asli bagi 2, kira-kira 0.693. Anda akan melihat ini dalam algoritma yang berurusan dengan pokok binari, entropi maklumat, atau analisis kompleksiti masa yang melibatkan matematik log-asas-2.
Nilai-nilai ini adalah nombor apungan ketepatan berganda (double-precision floats) sepenuhnya. Oleh kerana ia adalah sifat (properties) dan bukannya kaedah (methods), anda mengaksesnya tanpa kurungan.
Pembundaran, Tanda, dan Nilai Mutlak
Tugas Math yang paling biasa melibatkan pembersihan nombor. JavaScript memberikan anda empat kaedah pembundaran, dan ia tidak berkelakuan secara identik, terutamanya apabila anda keluar dari zon positif.
Math.abs(x) mengembalikan magnitud sesuatu nombor. Masukkan -42 dan anda akan mendapat 42. Ia berguna apabila anda lebih mementingkan jarak berbanding arah. Fikirkan tentang membandingkan cap masa (timestamps), mengira delta seretan dalam UI, atau menyemak jika sesuatu tekaan berada dalam had ralat.
Math.round(x) adalah pembundar tahap sekolah rendah. Ia mengambil integer terdekat, membundarkan nilai separuh ke atas ke integer positif seterusnya. Jadi 4.4 menjadi 4, dan 4.5 menjadi 5.
Math.ceil(x) sentiasa membundar ke atas ke integer seterusnya. 4.1 menjadi 5, dan -4.9 menjadi -4. Perkara terakhir itu sering mengejutkan orang. Oleh kerana -4 adalah lebih besar daripada -4.9 pada garis nombor, ceil bergerak ke arah sifar untuk nilai negatif.
Math.floor(x) adalah sebaliknya. Ia sentiasa membundar ke bawah. 4.9 menjadi 4, dan -4.1 menjadi -5. Jika anda melakukan paginasi keputusan carian atau memperuntukkan blok memori bersaiz tetap, floor biasanya adalah apa yang anda mahukan.
Math.trunc(x) membuang bahagian perpuluhan sepenuhnya, meninggalkan hanya bahagian integer. Kesannya, ia bergerak ke arah sifar tanpa mengira tanda. 4.9 menjadi 4, dan -4.9 menjadi -4. Jika anda memindahkan logik daripada bahasa yang menukar float kepada int dengan cara pemotongan (truncating), inilah rakan baik anda.
Akhir sekali, Math.sign(x) memberitahu anda di sebelah mana nilai itu berada berbanding sifar. Ia mengembalikan 1 untuk positif, -1 untuk negatif, 0 untuk sifar positif, -0 untuk sifar negatif, dan NaN untuk apa sahaja yang bukan nombor. Ia adalah cara ringkas untuk membuat cawangan (branching) berdasarkan arah tanpa perlu menulis rantaian if-else.
Menjana Nombor Rawak
Math.random() menghasilkan nombor apungan pseudo-rawak dari 0 (termasuk) hingga 1 (tidak termasuk). Ia tidak selamat secara kriptografi, jadi jangan gunakannya untuk penjanaan kata laluan, penciptaan token, atau apa-apa sahaja yang melibatkan wang sebenar.
