Пусть значение меняется из ниоткуда - PullRequest
1 голос
/ 11 февраля 2020

Может кто-нибудь объяснить мне, почему переменные start и end выводят на консоль различные значения для этих регистраторов?
Я получаю распечатку:
start1 = пн 17 февраля 2020 10:00:00 GMT + 0100 (центральноевропейское стандартное время)
end1 = пн 17 февраля 2020 11:30:00 GMT + 0100 (центральное Стандартное европейское время)
start2 = пн 17 февраля 2020 г. 11:30:00 GMT + 0100 (центральноевропейское стандартное время)
end2 = пн 17 февраля 2020 г. 11:30:00 GMT + 0100 (центральноевропейское стандартное время)

Хочу добавить, что представленный мною код, конечно, каким-то методом, а имена start и end не мешают другим именам переменных.

let start = this.service.getDateTime(
  eventFromUi.start_date,
  eventFromUi.start_time_hour,
  eventFromUi.start_time_minute
);
console.log("start1 = " + start);
let end = this.service.getDateTime(
  eventFromUi.start_date,
  eventFromUi.end_time_hour,
  eventFromUi.end_time_minute
);
console.log("end1 = " + end);
console.log("start2 = " + start);
console.log("end2 = " + end);

РЕДАКТИРОВАТЬ:
Метод getDateTime () возвращает объект Typeb типа ootb Date.
Я использовал Chrome отладчик, чтобы разобраться в этом, и я вижу, что когда я впервые выполняю метод getDateTime (), я получаю значение Пн 17 февраля 2020 10:00:00 GMT + 0100 (Центрально-европейский стандарт Время) возвращено и назначено для start .
Затем метод getDateTime () выполняется снова и возвращает значение Пн 17 февраля 2020 11:30:00 GMT + 0100 (Центрально-европейское стандартное время) , и это значение присваивается обоим переменные start и end .
Как это происходит?

EDIT2:
Функция getDateTime:

getDateTime(dateWithoutTime: Date, hour: number, minute: number): Date {
    let date = dateWithoutTime;
    console.log(date);
    console.log(hour);
    console.log(minute);
    date.setHours(hour);
    date.setMinutes(minute);
    return date;
  }

1 Ответ

3 голосов
/ 11 февраля 2020

Это происходит потому, что вы имеете дело со ссылками на объекты.

getDateTime(dateWithoutTime: Date, hour: number, minute: number): Date {
    let date = dateWithoutTime;
    // date is now a copy of the *reference* to the same object that
    // dateWithoutTime is a reference to. In other words: it is pointing
    // to the same object in memory

    date.setHours(hour);
    date.setMinutes(minute);
    // since date is pointing to the same object as dateWithoutTime, this is
    // modifying both date and dateWithoutTime

    return date;
  }

Это также означает, что в вашем коде eventFromUi.start_date, start и end - все ссылки, указывающие на тот же объект Date .

Чтобы решить вашу проблему, убедитесь, что вы создали клон из dateWithoutTime, когда он будет передан в вашу функцию:

getDateTime(dateWithoutTime: Date, hour: number, minute: number): Date {
    let date = new Date(dateWithoutTime);
    // date is now a reference to a *new Date object* with the same
    // date/time/etc. values as dateWithoutTime

    date.setHours(hour);
    date.setMinutes(minute);
    // since date now points to a new object, this is only modifying date
    // while leaving dateWithoutTime alone and unchanged

    return date;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...