Кажется, что значения справа от = сначала кэшируются, затем каждое присваивание выполняется в порядке слева направо.Если последние назначения зависят от значений предыдущих назначений, это приведет к неинтуитивным результатам
Babel компилирует код ES6 в следующие операторы:
"use strict";
// try to sort the array by swapping elements
var a = [2, 1];
// does not work
var _ref = [a[a[0] - 1], a[0]];
a[0] = _ref[0];
a[a[0] - 1] = _ref[1];
console.log(a); // [2, 1]
Первый пример дает неинтуитивный результат, потому что [0] изменяется до того, как к нему будет получен доступ как часть второго назначения.
Замена порядка назначения таким образом, чтобы к [0] обращались до изменения его значения, получен правильный результат.
// does work
var _ref2 = [a[0], a[a[0] - 1]];
a[a[0] - 1] = _ref2[0];
a[0] = _ref2[1];
console.log(a); // [1, 2]