Maison > interface Web > js tutoriel > le corps du texte

Pourquoi « 040 » est-il égal à « 32 » en JavaScript ?

Patricia Arquette
Libérer: 2024-11-21 14:43:09
original
526 Les gens l'ont consulté

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

Nombres zéro non significatifs en JavaScript

Question :

Pourquoi 40 est-il représenté par 32 en JavaScript ?

var num = 040;
console.log(num); // 32
Copier après la connexion

Réponse :

En JavaScript, le nombre sera traité comme octal (base 8) en raison du 0 en tête, tout comme le 0x en tête le fera C'est identique à l'hexadécimal (base 16). Ce comportement a une longue histoire, mais dans le JavaScript moderne, les nombres octaux ne sont plus écrits sous cette forme. Dans le JavaScript moderne utilisant le mode strict, le format octal « traditionnel » est une erreur de syntaxe ; les nombres octaux doivent être écrits avec le préfixe 0o.

Historique :

Au début (dans le langage Netscape d'origine et dans les première et deuxième spécifications ECMAScript), les 0 en tête des littéraux numériques étaient formellement représentés en octal (base 8 ), tout comme le 0x initial indique un hexadécimal (base 16) :

OctalIntegerLiteral ::
    0 OctalDigit
    OctalIntegerLiteral OctalDigit
Copier après la connexion

Par exemple, 10, 012 et 0xA sont toutes des façons d'écrire le nombre décimal 10. Ceci est cohérent avec certains autres langages (tels que C, C++ et Java) dont la syntaxe est similaire à JavaScript, mais est très déroutante.

À partir d'ECMAScript 3, cette forme de littéraux octaux a été rétrogradée au rang d'extension facultative, et les littéraux entiers décimaux ont été modifiés afin qu'ils ne puissent pas avoir de zéros non significatifs (sauf si l'implémentation inclut l'extension) :

DecimalIntegerLiteral ::
    0
    NonZeroDigit DecimalDigits(opt)
Copier après la connexion

Mais en mode strict, ECMAScript 5 interdit cela :

Lorsqu'il s'agit de code en mode strict (voir 10.1.1), une mise en œuvre conforme NE DEVRAIT pas étendre la syntaxe de NumericLiteral pour inclure OctalIntegerLiteral comme décrit au B.1.1.

ECMAScript 6 (ECMAScript 2015) a introduit BinaryIntegerLiteral et OctalIntegerLiteral, nous avons donc maintenant des littéraux plus cohérents :

  • BinaryIntegerLiteral, préfixé par 0b ou 0B.
  • OctalIntegerLiteral, avec le préfixe 0o ou 0O.
  • HexIntegerLiteral, préfixé par 0x ou 0X.

L'ancienne extension OctalIntegerLiteral a été renommée en LegacyOctalIntegerLiteral, qui est toujours autorisée en mode non strict.

Conclusion :

Donc, si vous souhaitez analyser des nombres octaux, vous pouvez utiliser le préfixe 0o ou 0O (non pris en charge par les anciens navigateurs), ou utiliser parseInt.

Si vous voulez vous assurer que votre numéro sera analysé en base 10, supprimez les zéros non significatifs ou utilisez parseInt.

Exemple :

  • 010

    • en mode strict (nécessite ECMAScript 5), c'est une erreur de syntaxe.
    • En mode non strict, il peut s'agir d'une erreur de syntaxe ou d'un retour 8 (dépendant de l'implémentation).
  • 0o10, 0O10

    • Avant ECMAScript 6, il s'agissait d'erreurs de syntaxe.
    • Dans ECMAScript 6, ils renvoient 8.
  • parseInt('010', 8)

    • Il renvoie 8.
  • parseInt('010', 10)

    • Il renvoie 10.

Si vous êtes intéressé, vous pouvez trouver les dernières spécifications actuelles ici et les versions historiques ici.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal