谁能告诉我输出是怎么变成的吗未定义?

变量foo={n:2};foo.x=foo={n:2};console.log(foo.x);//未定义
5
  • 1
    有趣的是test.x并没有定义, 评论 2016年6月13日15:22
  • 你想要这样的东西吗?x=foo,{n:2};不? 评论 2016年6月13日15:31
  • @le_m想知道……你是怎么弄到这个问题的??:~)
    – 舒布
    评论 2016年6月13日15:37
  • @Shubh我不久前投了赞成票:)
    – 列姆
    评论 2016年6月13日15:38
  • @le_m太棒了!!最后我有一个很好的问题要加书签:)
    – 舒布
    评论 2016年6月13日15:45

3个答案

重置为默认值
10
foo.x=foo={n:2};

这个食品。x个指财产x个所引用对象的foo公司然而,foo={n:2}将一个全新的对象指定给foo公司.x个确实指定给了一个对象,但该对象会立即被另一个对象替换。带有x个属性不再被任何内容引用。

你可以把这句话读作

foo.x=(foo={n:2});

图形化解释

变量foo={n:2};

第一个对象被分配给foo

foo.x=foo={n:2};

foo被重新分配给第二个对象,但foo.x仍然指向第一个对象。

控制台.log(foo.x);

试图访问foo.x实际上访问了第二个对象的x属性。

2

我将分解每个变量的赋值和输出。

变量foo={n:2}//foo:对象{n:2}//foo.x:未定义foo.x=3//foo:对象{n:2,x:3}//foo.x:3foo.x=foo//foo:对象{n:2,x:对象{n:20,x:Object(递归)}}//foo.x:对象{n:2,x:对象{n:20,x:Object(recursive)}}foo.x=foo={n:2}//foo:对象{n:2}//foo.x:未定义

如您所见,最后一行重置foo公司等于{编号:2}这使得食品。x个不存在(因为您覆盖了foo公司对象)

0
0

您的代码与此代码完全相同,

变量foo={n:2};//foo==>{n:2}foo.x={n:2};//foo==>{n:2,x:{n:2}}foo={n:2};//foo==>{n:2}console.log(foo.x);//未定义

因为对象中没有“x”键

2
  • 不过是吗?赋值表达式不是从右向左计算的吗?
    – 纽达
    评论 2020年6月8日20:51
  • 什么?分配是连续的!你应该按顺序解释每一行
    – 阿尤布
    评论 2020年6月9日13:00

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.