javascript变量赋值核心

时间:2013-01-31 17:42:44

标签: javascript

假设我有这个

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={};
 y=x;
 x.name="maizere";
 alert(y.name)//maizere

我真的不知道这是如何运作的。任何人都可以详细解释这个吗?

2 个答案:

答案 0 :(得分:3)

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

var x = {}; 
var z = x;

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

当您执行x = { name: "Maizere" };时,您要将对象分配给xz仍然指向原始对象。

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

答案 1 :(得分: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