Указатели и даты JavaScript - PullRequest
       7

Указатели и даты JavaScript

1 голос
/ 23 апреля 2010

Я заметил эту ситуацию в своем коде (к сожалению) и смог продублировать ее в своем собственном файле JS.Итак, у меня есть этот код:

var date1 = new Date();  // today
var date2 = date1;

date2 = date2.setDate(date2.getDate() + 1);
// what is date1?

После выполнения этого кода date1 - это сегодняшняя дата + 1!Это восходит к моим временам старшекурсника, когда я узнал об указателях, и я думаю, что я немного ржавый.Это то, что здесь происходит?Очевидно, я переместил назначение из date1, и я только изменяю date2, но date1 изменяется.Почему это так?

Кстати, после выполнения этого кода date2 - это длинное число, например 1272123603911. Я предполагаю, что это число секунд в дате, но не должно ли date2 оставаться объектом Date?setDate () должен возвращать объект Date.

Ответы [ 4 ]

4 голосов
/ 23 апреля 2010

Классический случай типов референций и типов значений.

Когда оператор присваивания работает с примитивными значениями (числами, строками, логическими, нулевыми и неопределенными), создается копия значения,Когда оператор присваивания работает с объектами JavaScript, ссылки на объекты копируются.

Назначение по значению в сравнении с назначением по ссылке

Следовательно:

// creates a new Date object in memory with date1 as a Reference to its location
var date1 = new Date();

// date2 will now point to the same Object in memory as date1
var date2 = date1;

// Since both date1 and date2 point to the same object,
// modifying one changes the other
date2 = date2.setDate(date2.getDate() + 1);

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

3 голосов
/ 23 апреля 2010

Ваши переменные date1 и date2 указывают на один и тот же объект.

Именно поэтому, когда вы выполняете setDate для переменной date2, вы видите изменение date1потому что на самом деле две переменные указывают на один и тот же объект.

    _____             ____________
   |date1| --------->| new Date();|
    ¯¯¯¯¯             ¯¯¯¯¯^¯¯¯¯¯¯
    _____                  |
   |date2| -----------------
    ¯¯¯¯¯ 

Метод setDate возвращает объект valueOf Date после его изменения, который представляет собой числовое представление, миллисекунды с 01Январь 1970 UTC до вашей даты.

1 голос
/ 23 апреля 2010

Этот код:

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

Когда вы изменяете свойства объекта, это никак не влияет на ссылку на объект. Свойства объекта принадлежат объекту, а не ссылке на объект. Таким образом, поскольку две переменные указывают (ссылаются) на одно и то же, если вы измените это с помощью одной из переменных, вы увидите изменения, если запросите объект с помощью другой переменной.

1 голос
/ 23 апреля 2010
  • обе ваши переменные ссылаются на один и тот же объект, и вызов setDate() фактически меняет сам объект (другими словами, он не просто клонирует оригинал и возвращает новый)
  • Когда вы используете объект Date в выражении, он может быть приведен к числу, которое (как вы говорите) - это количество секунд с начала эпохи.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...