【问题标题】:Explain this javascript code解释这段 javascript 代码
【发布时间】:2015-07-31 16:39:50
【问题描述】:

我有一个关于变量赋值的问题

var foo = {n: 1};

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

console.log(foo.x) // undefined

为什么foo.xundefined

【问题讨论】:

  • 如果你将 5 分配给 x 和 y 为什么会是三个
  • 反对者,请发表评论!
  • 抱歉,@RiteshK 我删除了那个
  • 如果 foo 是一个对象,而 foo.x 是对 foo 的引用...所以 foo === foo.x === foo.xx.. 你不能那样做 ^ ^
  • RiteshK 这不是问题所在。你可以在 2 行而不是 1 行上完成它,它工作正常

标签: javascript variables


【解决方案1】:

= 赋值运算符是右关联的,这意味着从右到左计算赋值链。也就是语言对待这个

x = y = x+2;

好像是写出来的

x = (y = x+2);

所以首先y 被分配了加法的结果(5),然后x 被分配了该分配的值,这也是5

你问题中的第一个例子是同一个故事,但事情有点复杂:

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

所做的第一个赋值是对该对象字面量的foo。但是,该点之前,语言将确定foo.x 的引用值,这是对原始 @ 上的(尚不存在的)属性的引用987654331@ 对象。因此,当对该属性进行右侧赋值时,它确实有效,但该属性设置在旧对象上,而不是新对象上!

我们换个例子:

var foo = {n: 1}, foo2 = foo;

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

console.log(foo2.x); // { n: 2 }

该版本在变量foo2 中保留了对foo 原始值的另一个引用。即使 foo 在双重赋值中被覆盖,foo2 将继续引用原始的 foo

【讨论】:

  • 此问题已被删除
  • @RiteshK 是的 - 查看答案更新,我正在添加一个示例
  • 这就是foo.x = foo = {a:1};foo = {a:1}; foo.x = foo; 不同的原因。在第一种情况下,引用不是创建,但在第二种情况下是。
  • @Pointy 是 foo.x = foo = {n: 2};分解为 foo.x = {n: 2}; foo = {n: 2}; ?
猜你喜欢
  • 2013-08-24
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
相关资源
最近更新 更多