猿问

一道关于对象赋值的js面试题

  var a = { n : 1};  
  var b = a;  
  a.x = a = {n:  2};  
  alert(a.x);  
  alert(b.x);

输出:undefined 
[object Object]
请问:a.x = a = {n: 2}; 该句是如何赋值的?


鸿蒙传说
浏览 1122回答 3
3回答

12345678_0001

  var a = { n : 1};    var b = a;    //语句从左到右执行,赋值从右到左。  //执行a.x时,a还是指向的是{n:1}的空间。  //赋值a时,a指针指向了{n:2},a.x中a原来指向的空间{n:1}添加x属性,指向现在a指向的空间{n:2};  a.x = a = {n:  2};    console.log(a.x);      //undefined  console.log(b.x);     //{n:2} 

墨色风雨

应该是从右到左的。a.x=a={n:2},先是执行a.x此刻a指向{n:1},然后执行 a={n:2}将a重新指向,最后执行a.x=a,即{n:1}.x = {n:2}.

ibeautiful

其实这类问题很容易理解,只需要记得变量只是对象的引用,变量并不是对象本身。取值的时候顺着变量找到对象;赋值的时候则改变变量的指向。所以对于 var a = {n: 1},想象一个对象 {n: 1} 放地上,用 a 指着它;var b = a 就是 b 顺着 a 找到 {n: 1},两者同时指着它;a.x = a = {n:2} 左往右看,a.x 是对 a 取值,顺着 a 找到 {n: 1},再找到其 x 属性等待赋值,第二个 a 本应是取值,但右边有 = 所以继续变成了赋值操作,a 指向 {n:2},a = {n:2} 返回 {n:2},给了等待赋值的 {n: 1}.x;alert(a.x),顺着 a 找到 {n:2},因为在 3.2 中 a 改变了指向,而 {n: 2} 没有 x 属性;alert(b.x),顺着 b 找到 {n: 1},{n: 1}在 3.1 得到了 x,顺着 x 找到了 {n: 2}。
随时随地看视频慕课网APP
我要回答