Итак, я на днях поигрался, просто чтобы увидеть, как именно массовое назначение работает в JavaScript.
Сначала я попробовал этот пример в консоли:
a = b = {};
a.foo = 'bar';
console.log(b.foo);
В результате в предупреждении отображалась «полоса». Это достаточно справедливо, aи bна самом деле это просто псевдонимы одного и того же объекта. Тогда я подумал, как бы упростить этот пример.
a = b = 'foo';
a = 'bar';
console.log(b);
Это почти то же самое, не так ли? Что ж, на этот раз он возвращается fooне так, barкак я ожидал бы от поведения первого примера.
Почему это происходит?
NB. Этот пример можно еще больше упростить с помощью следующего кода:
a = {};
b = a;
a.foo = 'bar';
console.log(b.foo);
a = 'foo';
b = a;
a = 'bar';
console.log(b);
(Я подозреваю, что JavaScript обрабатывает примитивы, такие как строки и целые числа, иначе, чем хеши. Хэши возвращают указатель, в то время как "базовые" примитивы возвращают свою копию)