Mengapakah `040` Sama dengan `32` dalam JavaScript?

Patricia Arquette
Lepaskan: 2024-11-21 14:43:09
asal
546 orang telah melayarinya

Why Does `040` Equal `32` in JavaScript?

Mendahului nombor sifar dalam JavaScript

Soalan:

Mengapa 40 diwakili sebagai 32 dalam JavaScript?

var num = 040;
console.log(num); // 32
Salin selepas log masuk

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
Salin selepas log masuk

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)
Salin selepas log masuk

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:

  • BinaryIntegerLiteral, diawali dengan 0b atau 0B.
  • OctalIntegerLiteral, dengan awalan 0o atau 0O.
  • HexIntegerLiteral, diawali dengan 0x atau 0X.

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

    • dalam mod ketat (memerlukan ECMAScript 5), ia adalah ralat sintaks.
    • Dalam mod tidak ketat, ini mungkin ralat sintaks atau pulangan 8 (bergantung pada pelaksanaan).
  • 0o10, 0O10

    • Sebelum ECMAScript 6, ia adalah ralat sintaks.
    • Dalam ECMAScript 6, mereka mengembalikan 8.
  • parseInt('010', 8)

    • Ia mengembalikan 8.
  • parseInt('010', 10)

    • Ia mengembalikan 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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan