我写了以下代码
o[s += "a"] = o[s += "b"] = o[s += "c"] = 0;
我很好奇为什么变量s
最终存储“abc”而不是“cba”。似乎代码从右到左执行会更容易。
我好像执行者选择存储器索引然后决定存在什么,但这样做会让它听起来更慢,因为会有很多状态和内存被压入堆栈。有人可以解释为什么代码按顺序执行是有意义的吗?
我添加了一些小提琴,还有一些例子。 http://jsfiddle.net/eggrdtuk/3/
答案 0 :(得分:4)
计算成员访问优先级为1,赋值优先级为16.因此首先计算属性访问表达式,然后计算赋值操作。此外,Computed Member Access具有从左到右的关联性,而Assignment具有从右到左的关联性。
因此,我们可以想到从左到右解析属性访问表达式的第一步:
o["a"] = o["ab"] = o["abc"] = 0
第二步是从右到左做分配:
(o["a"] = (o["ab"] = (o["abc"] = 0)))
(o["a"] = (o["ab"] = 0))
(o["a"] = 0)
我不知道改变任何一个步骤的关联性会如何改变性能。但如果有原因,我很乐意学习:)