Soalan:
Mengapa 40 diwakili sebagai 32 dalam JavaScript?
var num = 040; console.log(num); // 32
Jawapan:
Dalam JavaScript, nombor akan dianggap sebagai perlapanan (asas 8) disebabkan 0 pendahuluan, sama seperti 0x pendahuluan akan dibuat ia Sama seperti perenambelasan (asas 16). Tingkah laku ini mempunyai sejarah yang panjang, tetapi dalam JavaScript moden, nombor perlapanan tidak lagi ditulis dalam bentuk ini. Dalam JavaScript moden menggunakan mod ketat, format perlapanan "tradisional" ialah ralat sintaks; harus ditulis dengan awalan 0o.
Sejarah:
Pada zaman awal (dalam bahasa Netscape asal dan spesifikasi ECMAScript yang pertama dan kedua), mendahului 0 pada literal angka yang secara rasmi diwakili perlapanan ( asas 8 ), sama seperti 0x terkemuka menunjukkan perenambelasan (asas 16):
OctalIntegerLiteral :: 0 OctalDigit OctalIntegerLiteral OctalDigit
Sebagai contoh, 10, 012, dan 0xA ialah semua cara untuk menulis nombor perpuluhan 10. Ini konsisten dengan beberapa bahasa lain (seperti C, C++, dan Java) yang sintaksnya serupa dengan JavaScript, tetapi sangat mengelirukan.
Bermula dalam ECMAScript 3, bentuk literal perlapanan ini diturunkan kepada sambungan pilihan dan literal integer perpuluhan ditukar supaya tidak boleh mempunyai sifar pendahuluan (melainkan pelaksanaannya termasuk sambungan):
DecimalIntegerLiteral :: 0 NonZeroDigit DecimalDigits(opt)
Tetapi dalam mod ketat, ECMAScript 5 melarang ini:
Apabila berurusan dengan kod mod ketat (lihat 10.1.1), pelaksanaan yang mematuhi HARUS tidak melanjutkan sintaks NumericLiteral untuk memasukkan OctalIntegerLiteral seperti yang diterangkan dalam B.1.1.
ECMAScript 6 (ECMAScript 2015) memperkenalkan BinaryIntegerLiteral dan OctalIntegerLiteral, jadi kini kami mempunyai literal yang lebih koheren:
Pelanjutan OctalIntegerLiteral lama telah dinamakan semula kepada LegacyOctalIntegerLiteral, yang masih dibenarkan dalam mod tidak ketat.
Kesimpulan:
Jadi jika anda ingin menghuraikan nombor perlapanan, anda boleh menggunakan awalan 0o atau 0O (tidak disokong oleh pelayar lama), atau gunakan parseInt.
Jika anda ingin memastikan nombor anda akan dihuraikan sebagai asas 10, alih keluar sifar pendahuluan atau gunakan parseInt.
Contoh:
010
0o10, 0O10
parseInt('010', 8)
parseInt('010', 10)
Jika anda berminat, anda boleh mendapatkan spesifikasi terkini semasa di sini dan versi sejarah di sini.
Atas ialah kandungan terperinci Mengapakah `040` Sama dengan `32` dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!