Heim > Fragen und Antworten > Hauptteil
Wir alle wissen, dass die Zuweisung in JavaScript von rechts nach links erfolgt
var a = b = c
Die obige Anweisung wird tatsächlich so ausgeführt
b = c
var a = b
Aber was ist, wenn jemand involviert ist? Ein Beispiel, das ich gestern gesehen habe
var foo = { a: 2 }
var bar = foo
foo.x = foo = { b: 3 }
Die ersten beiden Zeilen sind sehr einfach, sie verweisen von bar auf foo.
In der dritten Zeile wird zu Beginn foo = { b: 3 } ausgeführt, wodurch foo auf ein anderes Objekt umgeleitet wird.
Der nächste Satz foo.x = foo, das dachte ich ursprünglich foo.
foo = {
b: 3,
x: {
b: 3,
x: {
b: 3,
x: {
......
}
}
}
}
Aber der eigentliche Test ergab, dass foo.x im Satz foo ist. Aber wird die tatsächliche Ausführung von rechts nach links erfolgen? PHPz2017-05-18 10:53:04
这个我刚刚看到了一个大神的讲解挺好的(正在查资料核对),对象的连等赋值,大概解释是这样的:foo.x = foo = { b: 3 },在解释器执行中先看foo.x 和foo是否已经创建如果未创建就创建它并且将他们都指向最右边的对象,明显foo创建了并且指向{ a: 2 },foo.x还未创建,于是创建它并且让它指向null,此时bar和foo都指向{a:2,x:null},再将他们都指向右边的对象{b:3},此时bar指向{a:2,x:{b:3}},foo指向{b:3};
PHP中文网2017-05-18 10:53:04
最近刚讨论过这个问题,我们得出的结论是:foo.x
中的 foo
实际是对 { a: 2 }
的一个引用,但执行顺序还是从右到左的,这点没有疑问。
var foo = { a: 2 }
var bar = foo.a = 3
console.log(bar) //3
var foo1 = { a: 2}
var bar1 = foo1.a
foo1.a = 3
console.log(bar1) //2
漂亮男人2017-05-18 10:53:04
赋值,是一个表达式,
结合性从右往左,即a = b = c
是a = (b = c)
返回值是,等号右边那个表达式的返回值,即 b = c
的返回值是c
的值。
仅有的幸福2017-05-18 10:53:04
局部左到右(.),宏观右到左(=)。此 foo 非彼 foo 。
foo.x = foo = { b: 3 }
读到第二个 foo 时,已经从第一个 foo 获取了 { a: 2 }
的引用,等待给其 x 属性赋值。
滿天的星座2017-05-18 10:53:04
赋值是从右到左的,但执行之前必然对代码进行处理,foo.x = foo = { b: 3 }
,对属性的处理是按值进行的,即此时已经定位到了{ a: 2 }
这个对象的实际存储位置,对属性x的赋值也是对实际对象的x属性赋值,不管他是foo指向的对象,还是bar指向的对象。对对象的赋值是改变该对象存储的实际对象的地址,即修改了foo的指向。
怪我咯2017-05-18 10:53:04
var a=b=c;
b=c;//c
a=c;
foo.x = foo = { b: 3 }
foo = { b: 3 };//返回值为 { b : 3 } 的指针,下同
foo.x = { b : 3 }的指针;
但是实际上按顺序执行上面三条语句,结果会有所不同,因为foo.x是在解析阶段已经准备好的,所以实际上指向的是bar.x
实际上的等价代码
foo.x = foo = { b: 3 }
foo = { b: 3 };//{ b : 3 }
bar.x = { b : 3 }的指针;