Javascript obje.key не определен при назначении самому объекту

avatar
knomdlo
8 апреля 2018 в 08:39
68
2
4

Я просматривал отрывок из здесь

var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};

Когда я регистрирую файл foo.x, он говорит, что он не определен. Почему это так? Я ожидал, что это будет {n: 2}

Источник

Ответы (2)

avatar
Sebastian Speitel
8 апреля 2018 в 08:55
0

Значения присваиваются слева направо, поэтому происходит следующее:

foo.x = {n: 2};

, в результате чего foo будет {n: 1, x: {n: 2}}

тогда foo присваивается новое значение

foo = {n: 2};

, который заменяет его на {n: 2}.

Andrew Svietlichnyy
8 апреля 2018 в 09:24
0

Но присваивание связывается справа налево: foo.x = foo = {n: 2}; эквивалентно броскам foo.x = (foo = {n: 2}); и (foo.x = foo) = {n: 2};.

knomdlo
10 апреля 2018 в 09:57
0

Вот это да. Оба ваших объяснения кажутся верными, но теперь я не понимаю, что такое правильный поток. Может кто-нибудь разобрать это. Я вижу ответ @AndrewSvietlichnyy более оправданным

Sebastian Speitel
10 апреля 2018 в 10:02
0

Я думаю, что его ответ правильный, но он приводит к поведению, которое я объяснил

avatar
Andrew Svietlichnyy
8 апреля 2018 в 09:07
0

Значение foo.x оценивается перед обоими присвоениями, поэтому оно ссылается на свойство x старого объекта foo. Это поведение определяется 12.14.4 Семантика времени выполнения: оценка (ES6, последний черновик), в котором говорится, что левая часть оператора присваивания (цель присваивания) должна оцениваться перед правой частью оператора присваивания. оператор присваивания (присваиваемое значение).

Итак, эти три результата имеют один и тот же результат:

var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};
console.log(foo, bar)

var foo = {n: 1};
var bar = foo;
bar.x = foo = {n: 2};
console.log(foo, bar)

var foo = {n: 1};
var bar = foo;
foo.x = (foo = {n: 2});
console.log(foo, bar)