Nous savons tous que l'affectation en JavaScript se fait de droite à gauche
var a = b = c
L'instruction ci-dessus est en fait exécutée comme ceci
b = c
var a = b
Mais que se passe-t-il si quelqu'un est impliqué ? Un exemple que j'ai vu hier
var foo = { a: 2 }
var bar = foo
foo.x = foo = { b: 3 }
Les deux premières lignes sont très simples, elles pointent bar vers foo.
Dans la troisième ligne, foo = { b: 3 } est exécuté au début, ce qui redirige foo vers un autre objet.
La phrase suivante foo.x = foo, je pensais au départ que foo.
foo = {
b: 3,
x: {
b: 3,
x: {
b: 3,
x: {
......
}
}
}
}
Mais le test réel a révélé que foo.x dans la phrase foo Mais l'exécution réelle se fera-t-elle de droite à gauche ?
Je viens de voir une bonne explication d'un grand maître (je vérifie les informations). L'explication approximative de l'affectation continue des objets est la suivante : foo.x = foo = { b: 3 }, d'abord lors de l'exécution de l'interpréteur. Vérifiez si foo.x et foo ont été créés. Sinon, créez-les et pointez-les tous les deux vers l'objet le plus à droite. Évidemment, foo est créé et pointe vers { a: 2 }, foo.x n'a pas encore été créé, alors créez-le. et laissez-le pointer vers null À ce moment-là, bar et foo pointent tous deux vers {a:2,x:null}, puis pointez-les tous les deux vers l'objet {b:3} à ce moment-là, bar pointe. vers {a:2,x:{b:3}. },foo pointe vers {b:3} ;
Nous venons d'aborder cette question récemment, et nous sommes arrivés à la conclusion que :
foo.x
中的foo
实际是对{ a: 2 }
est une référence, mais l'ordre d'exécution est toujours de droite à gauche, cela ne fait aucun doute.L'affectation est une expression,
L'associativité est de droite à gauche, c'est-à-dire que
a = b = c
esta = (b = c)
a = b = c
是a = (b = c)
返回值是,等号右边那个表达式的返回值,即
b = c
的返回值是c
La valeur de retour est la valeur de retour de l'expression à droite du signe égal, c'est-à-dire que la valeur de retour deb = c
est la valeur dec code>.
Local de gauche à droite (.), macro de droite à gauche (=). Ce foo n'est pas ça foo .
Lorsquelit le deuxième foo, il a déjà obtenu la référence de
{ a: 2 }
du premier foo et attend d'attribuer une valeur à son attribut x.L'affectation se fait de droite à gauche, mais le code doit être traité avant l'exécution.
foo.x = foo = { b: 3 }
,对属性的处理是按值进行的,即此时已经定位到了{ a: 2 }
L'emplacement de stockage réel de cet objet est également l'affectation à l'attribut x de l'objet réel, qu'il s'agisse de l'objet pointé. to by foo ou bar L'objet pointé. L'affectation à un objet modifie l'adresse de l'objet réel stocké dans l'objet, c'est-à-dire modifie le pointeur de foo.Je ne pense pas que cette façon d’écrire ait du sens.
Dans la production réelle, si vous rencontrez beaucoup de code de ce type, pouvez-vous le comprendre en un coup d'œil ?
Tout comme maintenant, combien de personnes ayant répondu à la question peuvent l'expliquer en termes simples ?
/a/11...
Mais en exécutant les trois instructions ci-dessus dans l'ordre, les résultats seront différents, car foo.x a été préparé pendant la phase d'analyse, donc il pointe en fait vers bar.x
Code équivalent réel
Vous pouvez utiliser des pointeurs pour comprendre ce problème