Il est bien connu pour tous ceux que la syntaxe de Javascript est si pitoyable.
Passons d'abord une photo
Le code est le suivant:
La copie de code est la suivante:
{} + []; // 0
[] + {}; // "[objet objet]"
{} + [] == [] + {}; // FAUX
({} + [] == [] + {}); // vrai
Un piège à syntaxe aussi douloureux n'est probablement qu'une chose étrange comme JavaScript.
Je crois que la plupart des chaussures pour enfants qui n'étudient pas du tout ne peuvent pas être comprises. (Au moins je trouve ça incroyable)
Plus tard, je suis allé à la fille de Baidu pendant un moment, puis je l'ai soudainement réalisé!
Jetons un coup d'œil à ce code:
La copie de code est la suivante:
{
A: 1
}
Je crois que la plupart des chaussures pour enfants penseront qu'il s'agit d'une mesure directe de l'objet à première vue.
Et ce code?
La copie de code est la suivante:
{
var a = 1;
}
Le navigateur provoquera-t-il des erreurs de syntaxe?
De toute évidence, non! Si vous y réfléchissez avec soin, nous comprendrons qu'il s'agit d'un bloc de déclaration.
La copie de code est la suivante:
if (isNumber) {
var a = 1;
}
En parlant de cela, vous avez peut-être découvert qu'il y aura une ambiguïté dans JavaScript à commencer par {.
Alors, comment le compilateur JavaScript traite-t-il cette ambiguïté?
Pour résoudre ce problème, la méthode d'ECMA est très simple et brute: lors de l'annexation de la syntaxe, si une instruction commence par "{", elle n'est interprétée que comme un bloc d'instructions.
C'est vraiment une façon de tricher!
Puisqu'ils sont tous des blocs d'instructions, pourquoi {A: 1} n'a-t-il pas d'erreurs de syntaxe?
En fait, ici, A est compris par l'analyseur comme une étiquette. Les balises sont utilisées pour faire correspondre les instructions de rupture et de continuer pour les sauts directionnels.
Par conséquent, une telle méthode d'écriture mettra une exception:
La copie de code est la suivante:
{
a: function () {}
}
Parce que la fonction () {} n'est pas une déclaration de fonction, ni une expression de fonction.
À ce stade, tout le monde devrait avoir un concept de base du traitement étrange de {}. Revenons sur les quelques phrases mentionnées au début de l'article:
La copie de code est la suivante:
{} + []; // 0
[] + {}; // "[objet objet]"
{} + [] == [] + {}; // FAUX
({} + [] == [] + {}); // vrai
Le premier, car {} est un bloc d'instructions, le code peut être compris comme:
La copie de code est la suivante:
if (1) {}
+ []
La valeur de retour est donc 0.
Deuxièmement, comme {} n'est pas au début de l'instruction, il s'agit d'une quantité directe d'objet normale, le tableau vide et l'objet vide sont ajoutés directement, et "[objet objet]" est renvoyé.
Je comprends les premier et deuxième articles, mais il n'est pas nécessaire d'expliquer le troisième article.
L'article 4, car il commence par (), le premier {} est analysé dans la quantité directe de l'objet, de sorte que les deux formules sont égales et redevient vraies.