В моем коде нередко можно увидеть несколько присваиваний в одной строке. Что-то вроде этого:

// creating short variable name to exports
const app = module.exports = { /* exports */ };

Тем не менее, это почти анти-шаблон, потому что он может случайно привести к утечке глобальной информации. Возьмите этот код в браузере, например:

function calc(v) {
  var value = max = 10;
  // …
}

Да, я слил максимальное значение как глобальное. Тем не менее, пока я осторожен, это полезно.

Разрушение

Вот тут я попался. Возьмем следующий пример (хотя и слегка запутанный). Целью следующего кода было взять уже существующий объект (значение справа), разрушить его в новый объект, содержащий подмножество свойств из RHS.

Итак, в приведенном ниже примере, каково значение one.c?

https://jsbin.com/galujos/4/edit?js,консоль

Чего я ожидал?

В прошлом, когда я рассматривал несколько назначений, я всегда читал это как президентство справа налево. Что-то вроде этого:

// a = b = 10
b = 10, a = b;

То, что вы видите слева, является результатом выражения справа.

Это не имеет никакого значения, когда вы присваиваете что-то простое, например, a = b = 10, потому что результат выражения b = 10 равен 10.

Однако это важно, когда я работал с деструктурированием (в примере выше), потому что результатом выражения является правая часть, равная двойке.

Поскольку результатом {a, b, d} = two является значение two, значение one.c будет таким же, как и two.c, а не неопределенным, как я надеялся.

Что здесь происходит на самом деле?

Вам будет легче понять это, если вы посмотрите на следующий пример: https://jsbin.com/vipava/8/edit?js,console

В первом выражении я присваиваю a = 2, но a имеет метод set и ничего не делает со значением. результат выражения выходит из системы: 2. Это не зависит от значения a.

Когда я снова записываю значение a, оно равно 1 и никогда не менялось.

дальнейшее чтение

Когда я увидел, что значение оказалось не таким, как я ожидал, было довольно просто скорректировать свое мышление и понять, что RHS важнее, но мне было интересно понять, почему.

Вот несколько дополнительных ресурсов, которые мне пригодились, чтобы разобраться в этом:

Первоначально опубликовано в журнале Remy Sharp’s b:log