2

假设我有这个

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

我真的不知道这是如何工作的。有人可以详细解释一下吗?

4

2 回答 2

3

您最初的假设是错误的;z是指向与 相同的对象的指针x

var x = {}; 
var z = x;

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

当你这样做时,x = { name: "Maizere" };你正在将一个对象分配给x. z仍然指向原始对象。

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
于 2013-01-31T17:51:57.127 回答
3

在这两个语句之后:

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
于 2013-01-31T17:53:00.113 回答