web-dev-qa-db-fra.com

Pourquoi les littéraux numériques octaux ne sont-ils pas autorisés en mode strict (et quelle est la solution?)

Pourquoi les littéraux numériques octaux ne sont-ils pas autorisés dans mode strict JavaScript ? Quel est le mal?

"use strict";
var x = 010; //Uncaught SyntaxError: Octal literals are not allowed in strict mode.
<h1>Check browser console for errors</h1>

Dans le cas où un développeur a besoin d'utiliser Octals (ce qui peut par erreur changer un nombre signifiant ), Y at-il un travail autour?

14
xameeramir

La partie "pourquoi" de la question ne répond pas vraiment.

Quant au "comment", du haut de ma tête ...

"use strict";
var x = parseInt('010', 8);
document.write(x);
11
Amit

Les littéraux octaux ne sont pas autorisés car leur interdiction décourage les programmeurs d'utiliser des zéros non significatifs comme remplissage dans un script. Par exemple, regardez l'extrait de code suivant:

var eight = 0008,
    nine = 00009,
    ten = 000010,
    eleven = 011;

console.log(eight, nine, ten, eleven);

Semble assez inoffensif, non? Nous les programmeurs avec OCD voulons juste aligner toutes les virgules ensemble pour que ça soit plus joli. Mais voici le problème:

8 9 8 9

Ceci est la sortie. Vous voyez à quel point cela devient incohérent? Tous les littéraux numériques remplis de zéros ne seront pas convertis en octaux, car 8 et 9 ne sont pas des chiffres octaux. Il est plus difficile de les garder cohérents lorsque vous devez vous souvenir de toutes ces règles, donc strict mode Facilite les choses en les interdisant complètement.

Au lieu de cela, vous devez remplir avec des espaces de début, ou si vous souhaitez utiliser octal, puis utilisez parseInt() avec l'argument optionnel radix de 8 Pour spécifiez octal.

Voici les deux "solutions", respectivement:

"use strict";

var eight  =  8,
    nine   =  9,
    ten    = 10,
    eleven = 11;

console.log(eight, nine, ten, eleven);
"use strict";

var eight  = parseInt('010', 8),
    nine   = parseInt('011', 8),
    ten    = parseInt('012', 8),
    eleven = parseInt('013', 8);

console.log(eight, nine, ten, eleven);
12
Patrick Roberts

De nos jours, avec un grand support de navigateur pour ES6, vous pouvez écrire ceci:

const NINE = 0o11; // octal
const TEN = 0b1010; // binary
const SEVENTEEN = 0x11; // hexa
6
Willian Balmant

Pourquoi les littéraux numériques octaux ne sont-ils pas autorisés en mode strict javascript? Quel est le mal?

Les octales dans JS ont toujours été une extension non standard de la norme (dans ES5, qui introduit le mode strict, elles sont dans l'annexe B, qui est une collection de fonctionnalités non standard prises en charge par la plupart des implémentations: sauf qu'elle définit les octales dans un manière incompatible avec les sites Web requis), et le mode strict a tenté de interdire toutes les extensions non standard. Le "pourquoi" quant à la raison pour laquelle ils n'ont jamais été standardisés est une question apparentée évidente, et que je ne connais pas.

Dans le cas où un développeur doit utiliser Octals (ce qui peut changer par erreur la signification d'un nombre), y a-t-il un moyen de contourner ce problème?

Comme @Amit a répondu, parseInt avec son deuxième argument car 8 fonctionne toujours en mode strict.

5
gsnedders