ES6: неинтуитивная перестановка элементов массива с использованием назначения деструктурирования - PullRequest
0 голосов
/ 29 января 2019

Попытка сортировки массива путем замены элементов с использованием деструктурирующего присваивания :

Сортированный массив должен представлять собой возрастающую последовательность целых чисел [1, 2, ...].

// try to sort the array by swapping 
const a = [2, 1];

Почему следующий фрагмент кода не меняет местами элементы должным образом?

// Swap the '2' with the number at its final position.
[a[0], a[a[0]-1]] = [a[a[0]-1], a[0]];
console.log(a); // Result is still [2, 1]

Однако переключение порядка элементов, подлежащих обмену, работает должным образом.

// Just changed the order of the two elements to be swapped
[a[a[0]-1], a[0]] = [a[0], a[a[0]-1]];
console.log(a); // Result is [1, 2] as expected

Вот такой узел REPL

1 Ответ

0 голосов
/ 29 января 2019

Кажется, что значения справа от = сначала кэшируются, затем каждое присваивание выполняется в порядке слева направо.Если последние назначения зависят от значений предыдущих назначений, это приведет к неинтуитивным результатам

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...