javascript - Un problème d'attribution de valeur en JS
过去多啦不再A梦
过去多啦不再A梦 2017-05-18 10:51:04
0
9
704

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 ?

过去多啦不再A梦
过去多啦不再A梦

répondre à tous(9)
PHPzhong

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} ;

Ty80

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.

var foo = { a: 2 }
var bar = foo.a = 3
console.log(bar) //3

var foo1 = { a: 2}
var bar1 = foo1.a
foo1.a = 3
console.log(bar1) //2
漂亮男人

L'affectation est une expression,
L'associativité est de droite à gauche, c'est-à-dire que a = b = c est a = (b = c) a = b = ca = (b = c)
返回值是,等号右边那个表达式的返回值,即 b = c 的返回值是cLa valeur de retour est la valeur de retour de l'expression à droite du signe égal, c'est-à-dire que la valeur de retour de b = c est la valeur de c code>.

仅有的幸福

Local de gauche à droite (.), macro de droite à gauche (=). Ce foo n'est pas ça foo .

foo.x = foo = { b:  3 }
Lorsque

lit 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...

刘奇
var a=b=c;

b=c;//c
a=c;
foo.x = foo = { b:  3 }

foo = { b:  3 };//返回值为 { b : 3 } 的指针,下同
foo.x = { b : 3 }的指针;

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

foo.x = foo = { b:  3 }

foo = { b:  3 };//{ b : 3 }
bar.x = { b : 3 }的指针;
洪涛

Vous pouvez utiliser des pointeurs pour comprendre ce problème

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal