Maison  >  Questions et réponses  >  le corps du texte

javascript - Un problème d'attribution de valeur en JS

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梦2711 Il y a quelques jours660

répondre à tous(9)je répondrai

  • PHPz

    PHPz2017-05-18 10:53:04

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

    répondre
    0
  • PHP中文网

    PHP中文网2017-05-18 10:53:04

    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

    répondre
    0
  • 漂亮男人

    漂亮男人2017-05-18 10:53:04

    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.

    répondre
    0
  • 仅有的幸福

    仅有的幸福2017-05-18 10:53:04

    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.

    répondre
    0
  • 滿天的星座

    滿天的星座2017-05-18 10:53:04

    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.

    répondre
    0
  • 高洛峰

    高洛峰2017-05-18 10:53:04

    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 ?

    répondre
    0
  • 迷茫

    迷茫2017-05-18 10:53:04

    /a/11...

    répondre
    0
  • 怪我咯

    怪我咯2017-05-18 10:53:04

    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 }的指针;

    répondre
    0
  • PHP中文网

    PHP中文网2017-05-18 10:53:04

    Vous pouvez utiliser des pointeurs pour comprendre ce problème

    répondre
    0
  • Annulerrépondre