В моем коде нередко можно увидеть несколько присваиваний в одной строке. Что-то вроде этого:
// 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 важнее, но мне было интересно понять, почему.
Вот несколько дополнительных ресурсов, которые мне пригодились, чтобы разобраться в этом:
- Себастьян Маккензи — создатель Babel
- Брендан Эйх — создатель JavaScript
- Кайл Симпсон Вы не знаете JavaScript о деструктурировании выражений присваивания
Первоначально опубликовано в журнале Remy Sharp’s b:log