如何理解下面一段js代码?

var a = {"x": 1};
var b = a;
console.log(b.x); 

a.x = 2;
console.log(b.x);

a = {"x":3};
console.log(b.x);
a.x = 4;
console.log(b.x);


上面四项输出打印a.x,输出结果分别是1 2 2 2

问题:
1.对象赋值是引用传递,但是var a = {"x": 1},等价于var a = {x: 1}吗?字符串做堆的指向栈?引用用可以用字符串来访问?

  
能不能分别解释一下上面四项输出?
  
阅读 2.9k
6 个回答
var a = {"x": 1};
var b = a;
// 这里是浅拷贝,b和a都指向同一个{"x": 1}
console.log(b.x); 

a.x = 2;
// 因为是浅拷贝, a.x更改的时候, b.x其实也更改了
console.log(b.x);

a = {"x":3};
// 这里是把a的引用指向{"x":3} 此时a和b的指向不是一个了, 所以无论怎么更新a.x, b.x都不会变了
console.log(b.x);
a.x = 4;
console.log(b.x);

1.var a = {"x": 1}等价于var a = {x: 1},对象的属性是字符串类型,是一样的。
2.var b = a,由于a是复杂类型,则b拿到的是a对应对象的地址,所以此时a/b是完全等同的,只要a或者b属性值发生改变,都会引起对方对应值的改变,因此第一和第二个打印1/2;
3.由于第三步时a={"x":3}相当于a重新赋值了另外一个对象,也就是另外一个对象的地址,这时候a和b就已经没有半毛钱关系了,无论a对象发生任何更改都不会对b对象产生影响,因此第三/四个打印都还是输出2

前两项比较好理解,就是引用嘛。
重点在于第三项,a的引用被重新指定为一个新对象,也就是其引用指向一个新的地址,但是此时b仍然指向之前a的地址。
或是说b=a时,只是将b的引用地址指向
当时a的地址并且不会随着a的地址而改变

每执行一段代码,都输出一次 a 和 b 就明白了!

去看看书吧,分清楚基本变量和引用变量

首先 var a={"x":1},然后 var b=a,即 b也指向 {"x":1},然后你又把 a={"x":3}, 但是 b的指向并没有变更

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题