Когда назначены примитивы, им присваивается по значению ;Типы ссылок (например, ваш объект) назначаются по ссылке (или, как поправляет меня Джон Скит, им назначается копия ссылки).
Во втором примере x и y оба указывают на один и тот же объект в памяти.Вот почему добавление свойства abc
к одному и добавление его к другому
Вы также заметили бы то же поведение, передавая x или y в функцию
function addABC(foo) {
foo.abc = 10;
}
var x = {};
var y = x;
addABC(x);
console.log(x.abc, y.abc);
Просто обратите внимание, чтохотя x и y указывают на один и тот же объект в памяти, они являются отдельными копиями ссылки, поэтому этот
var x = { a: 1 };
var y = x;
y = {};
alert(x.a);
и этот
var x = { a: 1 };
var y = x;
x = {};
alert(y.a);
все равно будут предупреждать 1.