Maison > Article > interface Web > Pourquoi « 040 » est-il égal à « 32 » en JavaScript ?
Question :
Pourquoi 40 est-il représenté par 32 en JavaScript ?
var num = 040; console.log(num); // 32
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
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)
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 :
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
0o10, 0O10
parseInt('010', 8)
parseInt('010', 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!