给出以下代码片段:
const arr = [];
let pos = 0;
const fn = () => { throw 'foo'; };
try {
arr[pos++] = fn();
} catch (e) {
console.log(pos);
}

我很惊讶地发现pos
的值是1.直观地说,我本来期望首先评估RHS,所以当抛出异常时pos
将保持不变。
有人可以指出涵盖此内容的规范的相关部分吗?或以其他方式解释行为?
答案 0 :(得分:2)
ECMAScript 2015 clearly defines this behavior:
AssignmentExpression [In,Yield] :LeftHandSideExpression [?Yield] = AssignmentExpression [?In,?Yield]
- 醇>
如果 LeftHandSideExpression 既不是 ObjectLiteral 也不是 ArrayLiteral ,那么
一个。让 lref 成为评估 LeftHandSideExpression 的结果。
湾ReturnIfAbrupt( LREF )。
℃。让 rref 成为评估 AssignmentExpression 的结果。
[...]
您可以看到首先评估左侧表达式,然后是右侧表达式( AssignmentExpression )。