我正在练习一些Javascript输出问题,遇到一个我无法理解输出的问题。这是代码:
var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};
foo.x的值是什么?
我认为它将给出为{n:2,x:{n:2,x .....}}。 但是它的值是不确定的。谁能向我解释为什么它的价值会变得不确定?
答案 0 :(得分:5)
foo
只是对对象的引用。
第foo.x = foo = {n: 2};
行从左到右依次发生。以下是依次发生的步骤:
foo.x
赋予foo
的值,该值是对n
属性等于1的对象的引用。
foo
然后分配给新对象{n: 2}
。由于foo
现在引用了一个没有x
属性的新对象,因此foo.x
是未定义的。
但是因为bar
是对原始foo
对象的引用(在重新分配之前),所以原始对象仍然存在于内存中。这就是bar
对象同时具有x
和n
属性的原因。
答案 1 :(得分:0)
这样想:
定义汽车并将其命名为foo
定义名为bar
的标志,它指向名为foo
的汽车
通过重新定义seat
的汽车并使其与汽车的座位相同,来定义您想进入foo
的汽车内的foo
(foo.x)。< / p>
您在这里所做的(基本上)是:
答案 2 :(得分:0)
这基本上是一种速记分配,可以在一行中将多个变量分配给同一值。
这有点令人困惑,因为我们正在处理引用。
var foo = {n:2}
{n:2}
是我们要处理的对象,在本示例中,我们将其称为TheObject
,我们可以使用bar,但为简单起见,请忘记bar引用了该对象var bar = foo;
到目前为止,一切都很清楚,希望现在在这行上:
foo.x = foo = {n: 2};
这里发生的是我们为foo.x和foo分配了一个新对象{n:2}
,
我们告诉foo指向这个新对象,但是foo.x有点特殊,它不是foo指向的东西,而是TheObject
我们的旧对象。
这是因为这是一行操作,当我们说foo
时,它只是标签/名称foo.x
是TheObject.x
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)
很抱歉,如果解释有点古怪,言语和我的想法都不太顺利。