JavaScript输出问题

时间:2018-11-04 15:58:35

标签: javascript output

我正在练习一些Javascript输出问题,遇到一个我无法理解输出的问题。这是代码:

var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};

foo.x的值是什么?

我认为它将给出为{n:2,x:{n:2,x .....}}。 但是它的值是不确定的。谁能向我解释为什么它的价值会变得不确定?

3 个答案:

答案 0 :(得分:5)

foo只是对对象的引用。

foo.x = foo = {n: 2};行从左到右依次发生。以下是依次发生的步骤:

  1. foo.x赋予foo的值,该值是对n属性等于1的对象的引用。

  2. foo然后分配给新对象{n: 2}。由于foo现在引用了一个没有x属性的新对象,因此foo.x是未定义的。

但是因为bar是对原始foo对象的引用(在重新分配之前),所以原始对象仍然存在于内存中。这就是bar对象同时具有xn属性的原因。

答案 1 :(得分:0)

这样想:

定义汽车并将其命名为foo

定义名为bar的标志,它指向名为foo的汽车

通过重新定义seat的汽车并使其与汽车的座位相同,来定义您想进入foo的汽车内的foo(foo.x)。< / p>


您在这里所做的(基本上)是:

  1. 创建对象
  2. 向对象添加属性
  3. 覆盖您刚刚创建的内容

答案 2 :(得分:0)

这基本上是一种速记分配,可以在一行中将多个变量分配给同一值。

这有点令人困惑,因为我们正在处理引用。

var foo = {n:2}
  1. foo是该对象的标签或名称,因此我们可以使用它。
  2. {n:2}是我们要处理的对象,在本示例中,我们将其称为TheObject,我们可以使用bar,但为简单起见,请忘记bar引用了该对象

var bar = foo;
  1. 这意味着我们正在为同一对象分配第二个名称。

到目前为止,一切都很清楚,希望现在在这行上:

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

这里发生的是我们为foo.x和foo分配了一个新对象{n:2}, 我们告诉foo指向这个新对象,但是foo.x有点特殊,它不是foo指向的东西,而是TheObject我们的旧对象。

这是因为这是一行操作,当我们说foo时,它只是标签/名称foo.xTheObject.x

OP的示例

var foo = {
  n: 1
};
var bar = foo;
foo.x = foo = {
  n: 2
};
console.log(foo)
console.log(bar)

测试示例

var foo = {n: 1};
var bar = foo;
// bar references the first object
// we didn't touche bar so we're good to test with it
bar.x = foo = {n: 2};
console.log(foo)
console.log(bar)

很抱歉,如果解释有点古怪,言语和我的想法都不太顺利。