Этот код:
var date1 = new Date(); // today
var date2 = date1;
... создает один объект даты, который имеет две ссылки на него. Поскольку обе переменные указывают на один и тот же объект, любые изменения в объекте видны при использовании любой переменной. Они оба указывают на одно и то же. Вещество, хранящееся в переменной, является ссылкой на объект, а не на фактический объект.
Лучший способ подумать об этом (и в буквальном смысле о том, что происходит) состоит в том, что переменные содержат значения. Полная остановка. С такими примитивами, как (скажем) число 5, значение, содержащееся в переменной, является значением. В случае ссылок на объекты значение, содержащееся в переменной, является ссылкой (указателем) на объект, а не на фактический объект. Насколько нам известно, эта ссылка - это число 77314, которое является указателем в какую-то справочную таблицу, где-то содержатся фактические данные объекта. Мы не знаем (или не заботимся), это просто значение, которое приводит нас к объекту.
Правила того, что происходит с присваиванием, передачей значений в функции и т. Д., Идентичны в обеих ситуациях & mdash; значения являются значениями. Итак:
var n1, n2;
n1 = 5; // n1 has the value 5
n2 = n1; // n2 now also has the value 5
И
var d1, d2;
d1 = new Date(); // d1 has a value that references the new Date object
d2 = d1; // d2 now also has that value, which references that object
Когда вы изменяете свойства объекта, это никак не влияет на ссылку на объект. Свойства объекта принадлежат объекту, а не ссылке на объект. Таким образом, поскольку две переменные указывают (ссылаются) на одно и то же, если вы измените это с помощью одной из переменных, вы увидите изменения, если запросите объект с помощью другой переменной.