29 votes

Comment JavaScript interprète-t-il + + i?

Une chose intéressante, je n'en ai jamais vu a été posté dans une autre question. Ils avaient quelque chose comme:

var i = + +1;

Ils pensaient que les extra - + converti en une chaîne, mais ils ont été tout simplement l'ajout d'une chaîne de caractères qui est ce qu'il fait à convertir.

Ceci, cependant, m'amènent à la question: qu'est-ce que se passe ici?

J'aurais effectivement prévu que pour être une erreur de compilation, mais le JavaScript (au moins dans google Chrome) est très bien avec elle... ça ne fait rien.

J'ai créé un petit JSFiddle à démontrer: Démo

var i = 5;
var j = + +i;
document.body.innerHTML = i === j ? 'Same' : 'Different';

Quelqu'un sait ce qui se passe réellement et ce que JavaScript est en train de faire avec ce processus?

J'ai pensé que peut-être cela le traiter comme ++i, mais i n'a pas d'incrément, et vous pouvez même le faire avec une valeur (par exemple, + +5), ce qui vous ne pouvez pas faire avec ++ (par exemple, ++5 est une erreur de référence).

L'espacement également de ne pas modifier (par exemple, + + 1 et + +1 sont les mêmes).

Ma meilleure supposition est que c'est essentiellement les traiter comme positif/négatif signes et de les mettre ensemble. Il ressemble 1 == - -1 et -1 == + -1, mais qui est tout simplement bizarre.

Est-ce juste une étrange comportement, ou est-elle documentée dans un standard de quelque part?

33voto

Second Rikudo Points 59550

Mettre votre la déclaration par le biais de l' AST Explorer, nous pouvons voir que ce que nous obtenons ici est de deux imbriqués Unaire Expressions, avec la unaires + de l'opérateur.

C'est une expression unaire composé d' + et +i, et +i est elle-même une expression unaire composé d' + et i.

Unaire expression unaire + de l'opérateur, va convertir l'expression de la partie en un nombre. Donc, vous êtes essentiellement de la conversion i d'un nombre, puis en convertissant le résultat de ce nombre, à nouveau, ce qui est un non-op).

Par souci de réalisation, il travaille sur autant de niveaux que vous ajoutez:

var i = 5;
console.log(+ + + + + +i); // 5
console.log(i); // still 5

9voto

ssube Points 8838

C'est dans le cahier des charges.

Creuser par le biais, nous pouvons voir §14.6.2.2 que l'incrémentation et de décrémentation les opérateurs sont répertoriées avant (et doit être de préférence) sur les opérateurs unaires. Donc, la priorité seul n'explique pas cela.

La recherche de la ponctuation tableau au §11.7, nous pouvons voir que chaque instance unique d' ++ (opérateur) dans la spec montre les deux ensemble, sans espaces. Ce n'est pas concluante, jusqu'à ce que vous vérifiez...

Les espaces règles du §11.2, en particulier:

L'espace blanc des points de code peut se produire à l'intérieur d'un StringLiteral, un RegularExpressionLiteral, un Modèle, ou un TemplateSubstitutionTail où ils sont considérés comme d'importants points de code faisant partie d'une valeur littérale. Ils peuvent également se produire dans un Commentaire, mais ne peut pas apparaître dans n'importe quel autre type de jeton.

JS ne permet pas arbitraire d'espaces mi-opérateur.

La JS syntaxe dans les deux PegJS et Esprima corroborer cela, la mise en correspondance sur le littéral chaîne de deux caractères ++.

6voto

Luan Nico Points 3337

Pour moi, c'est très clair;

 var a = +3;
var b = +a; // same as a, could be -a, for instance
var c = + +a; // same as above, same as +(+a)
 

4voto

adeneo Points 135949

Si vous n' ++variable l'interpréteur javascript voit que l' opérateur d'incrémentation.

Si vous n' + +variable l'interpréteur javascript voit comme Unaire plus, le fait de contraindre la valeur d'un nombre, deux fois.

Donc

var a = 1;
var b = +a;
var c = +b;

console.log(c);// still 1

est le même que

var c = + +1;

Donc, la réponse est simple, plus de deux signes ne peuvent pas être séparés par un espace pour être interprété comme incrémentation, de l'espace qu'il fait en sorte que l'interprète voit deux espaces séparés, qui est ce qu'il est vraiment

2voto

Walle Cyril Points 1131

Les opérateurs + se convertissent en un nombre, deux opérateurs + avec un espace entre les deux ne font rien de plus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X