#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.