Предположим, у меня есть это

var x={};    //x is an address in the memory where object is stored
var z=x;     //z=x after execution is equal to z={} right?

Теперь z не имеет ничего общего с x или не связано с x после выполнения, поэтому, когда,

x={name:"Maizere"};
z!=x        //true

Но когда

x.name="maizere";
alert(z.name)//maizere why?

Мы не устанавливаем значение z, но отношение x и z к x больше не должно выходить

Фактический код:

 x={};
 y=x;
 x.name="maizere";
 alert(y.name)//maizere

Я действительно не знаю, как это работает. Может кто-нибудь объяснить это подробно, пожалуйста?

2
Maizere Pathak 31 Янв 2013 в 21:42

2 ответа

Лучший ответ

Ваше первоначальное предположение неверно; z - указатель на тот же объект, что и x.

var x = {}; 
var z = x;

alert( z === x );    // true

Когда вы делаете x = { name: "Maizere" };, вы назначаете объект new для x. z по-прежнему указывает на объект original .

x = { name: "Maizere" };
alert( z !== x );    // true

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

var x = {}; 
var z = x;

x.name = "maizere";
alert( z === x );    // true

Еще один пример того, откуда может возникнуть путаница: синтаксис скобок создает новый объект вместо изменения оригинала.

var x = { name: "Maizere" };
var y = { name: "Zaimere" };

x = { age: 20 };
y.age = 30;

console.log( x );  // {age: 20}                  <-- original object is replaced
console.log( y );  // {name: "Zaimere", age: 30} <-- original object is modified
3
JJJ 31 Янв 2013 в 17:51

После этих двух заявлений:

x={};
y=x;

Внутреннее представление выглядит так:

      +---- x
      |
{} <--+
      |
      +---- y

Таким образом, любые изменения в x отражаются в y:

 x.name="maizere";
 alert(y.name)//maizere

Обновлено :

                     +---- x
                     |
{name: 'maizere'} <--+
                     |
                     +---- y

Это исчезнет, когда вы назначите любую переменную чему-то другому:

x = { name: "Maizere" }

Представление:

{name: 'Maizere'} <------- x

{name: 'maizere'} <------- y
3
Ja͢ck 1 Фев 2013 в 00:30