DateJS перезаписывает переменные

#javascript #datejs

#javascript #datejs

Вопрос:

Я только начинаю с DateJS, и это кажется отличной библиотекой, но я, очевидно, чего-то не хватает (возможно, глупой ошибки), но в моей функции мне нужны 3 даты: дата нажатия, начало недели и выходные. Но, используя DateJS, я, кажется, перезаписываю каждую переменную. Может кто-нибудь, пожалуйста, указать на мою ошибку?

 var clickDate = myDate;
    console.log(clickDate);
var weekStart = Date.parse(clickDate).last().monday();
    console.log(clickDate);
var weekEnd = Date.parse(clickDate).next().sunday();
    console.log(weekEnd);

console.log('break');   

console.log(clickDate);
console.log(weekStart);
console.log(weekEnd);
  

Консоль показывает следующее

 Date {Wed Nov 30 2011 00:00:00 GMT-0700 (US Mountain Standard Time)}
Date {Mon Nov 28 2011 00:00:00 GMT-0700 (US Mountain Standard Time)}
Date {Sun Dec 04 2011 00:00:00 GMT-0700 (US Mountain Standard Time)}
break
Date {Sun Dec 04 2011 00:00:00 GMT-0700 (US Mountain Standard Time)}
Date {Sun Dec 04 2011 00:00:00 GMT-0700 (US Mountain Standard Time)}
Date {Sun Dec 04 2011 00:00:00 GMT-0700 (US Mountain Standard Time)}
  

Комментарии:

1. Пожалуйста, прекратите. Отличный инструмент для программирования на JavaScript: jsfiddle.net . Что такое myDate , строка? Кстати, вы имели в виду console.log(clickDate) два раза подряд?

2. У меня это работает .

Ответ №1:

Это не проблема с Datejs, а особенность (?) объектов даты JavaScript. В JavaScript объект Date является изменяемым, и при присвоении Date объектному значению новой переменной создается ссылка на исходный, а не на новый объект.

Это можно продемонстрировать, используя простой старый JavaScript (без Datejs):

Пример

 var a = new Date(2011, 0, 1);
var b = a;
var c = b;

console.log('a', a); // 1-Jan-2011
console.log('b', b); // 1-Jan-2011
console.log('c', c); // 1-Jan-2011

// setting only 'a' will cause 'b' and 'c' to update as well.
a.setDate(10);

console.log('a', a); // 10-Jan-2011
console.log('b', b); // 10-Jan-2011
console.log('c', c); // 10-Jan-2011
  

Способ обойти это при использовании Datejs заключается в «клонировании» объектов Date. Следующий пример демонстрирует использование .clone() функции для объектов даты ‘b’ и ‘c’.

Пример

 var a = new Date(2011, 0, 1);
var b = a.clone(); // clone creates a new 'copy' of 'a'.
var c = b.clone();

console.log('a', a); // 1-Jan-2011
console.log('b', b); // 1-Jan-2011
console.log('c', c); // 1-Jan-2011

a.setDate(10);

console.log('a', a); // 10-Jan-2011
console.log('b', b); // 1-Jan-2011
console.log('c', c); // 1-Jan-2011
  

Выполнив вышеописанное, вы должны увидеть, что окончательные результаты ‘b’ и ‘c’ по-прежнему отражают их исходные значения, даже если ‘a’ изменился.

Надеюсь, это поможет.

Комментарии:

1. Дата в Javascript изменчива , а не неизменяема, как указано. Это ссылочный тип, правильный. Но ссылка на тип значения — это один аспект, в то время как изменчивость — это совершенно другое. Если бы все было хорошо, Date был бы (1.) неизменяемым (2.) типом значения, как в .Net.