Javascript foo.x的输出是什么
foo.x的输出是什么。 我的想法是从右到左评价 所以它等于Javascript foo.x的输出是什么,javascript,operator-precedence,Javascript,Operator Precedence,foo.x的输出是什么。 我的想法是从右到左评价 所以它等于 var foo = {n: 1}; var bar = foo; foo.x = foo = {n: 2}; 就这样吧 foo = {n:2}; foo.x = foo 但它不是,它是未定义的?我感到困惑,正在寻找解释。这是预期的行为。见: 简单赋值(=) 生产AssignmentExpression:LeftHandSideExpression=AssignmentExpression的计算如下: 让lref作为计算LeftHa
var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};
就这样吧
foo = {n:2};
foo.x = foo
但它不是,它是未定义的?我感到困惑,正在寻找解释。这是预期的行为。见: 简单赋值(=) 生产AssignmentExpression:LeftHandSideExpression=AssignmentExpression的计算如下:
x=
或x.prop=
时,它首先确定要分配给什么,即LeftHandSide表达式。然后,在对右侧(AssignmentExpression)求值后,它将该值赋给最初标识为LeftHandSideExpression的对象。所以,用
{
n: 1
x: {n: 2}
}
foo.x
变异原始的foo
对象,而不是重新分配的foo={n:2}
对象,因此在foo.x=foo={n:2}
行之后,foo
指的是新的{n:2}
,它永远不会变异
您可以看到bar
,它引用了内存中与原始foo
相同的对象,是如何变异的:
var foo={n:1};
var-bar=foo;
foo.x=foo={n:2};
控制台日志(bar)代码>
foo.x = foo = {n: 2};