Ответы на вопросы по Javascript - PullRequest
0 голосов
/ 04 ноября 2018

Я практиковал некоторые вопросы вывода Javascript и наткнулся на вопрос, который мне не понятен. Вот код:

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

какое будет значение foo.x?

Я думал, что это даст как {n: 2, x: {n: 2, x .....}}. Но это значение не определено. Может кто-нибудь объяснить мне, почему это значение не определено

Ответы [ 3 ]

0 голосов
/ 04 ноября 2018

foo - это просто ссылка на объект.

Строка foo.x = foo = {n: 2}; происходит в последовательности слева направо. Вот шаги, которые происходят в последовательности:

  1. foo.x задается значением foo, которое является ссылкой на объект со свойством n, равным 1.

  2. foo затем присваивается новому объекту, {n: 2}. Поскольку foo теперь ссылается на новый объект, у которого нет свойства x, то foo.x не определено.

Но поскольку bar является ссылкой на исходный объект foo (до того, как он был переназначен), то оригинальный объект все еще существует в памяти. Вот почему объект bar обладает свойствами x и n.

0 голосов
/ 05 ноября 2018

Это в основном сокращенное присвоение нескольких переменных одному значению в одной строке.

Это немного сбивает с толку, потому что мы имеем дело со ссылками.

var foo = {n:2}
  1. foo - это метка или имя для этого объекта, поэтому мы можем использовать его.
  2. {n:2} - это объект, с которым мы имеем дело, в этом примере мы назовем его TheObject, мы можем использовать bar, но для простоты забудем, что bar ссылается на этот объект

var bar = foo;
  1. это означает, что мы назначаем второе имя тому же объекту.

Пока все ясно, надеюсь, теперь на этой строке:

foo.x = foo = {n: 2};

Что здесь происходит, мы назначаем foo.x и foo новый объект {n:2}, мы говорим foo указать на этот новый объект, однако foo.x немного особенный, это не то, на что указывает foo, а TheObject наш старый объект.

Это потому что это однострочная операция, когда мы сказали foo это просто метка / имя foo.x это TheObject.x

Пример OP

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

Тестовый пример

var foo = {n: 1};
var bar = foo;
// bar references the first object
// we didn't touche bar so we're good to test with it
bar.x = foo = {n: 2};
console.log(foo)
console.log(bar)

извините, если объяснение немного шаткое, слова и мои мысли не так хороши.

0 голосов
/ 04 ноября 2018

Думайте об этом так:

Определите автомобиль и назовите его foo

Определить знак с именем bar, который относится к автомобилю с именем foo

Определите seat (foo.x), которым вы хотите быть внутри автомобиля с именем foo, переопределив автомобиль с именем foo и сделав сиденье таким же, как и у автомобиля.


То, что вы (по сути) сделали здесь:

  1. Создать объект
  2. Добавить объект к объекту
  3. Перезаписать то, что вы только что создали
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...