Почему оператор равенства возвращает false в первом случае?
var a = new Date(2010, 10, 10);
var b = new Date(2010, 10, 10);
alert(a == b); // <- returns false
alert(a.getTime() == b.getTime()); // returns true
Почему?
Поскольку даты являются встроенными объектами, а не примитивами , проверка равенства выполняется с использованием ссылок на объекты.
В этом случае объекты a
и b
не являются одним и тем же объектом, и поэтому тест не проходит.
Вы можете увидеть то же самое, используя
var a = new String("a");
var b = new String("a");
alert(a == b); //false
Используя .getTime
или .valueOf
, вы конвертируете значение объекта в примитив, и они всегда сравниваются по значению, а не по ссылке.
Если вы хотите выполнить сравнение по значению двух дат, существует также более неясный способ сделать это
var a = new Date(2010, 10, 10);
var b = new Date(2010, 10, 10);
alert(+a == +b); //true
В этом случае унарный оператор +
заставляет механизм javascript вызывать объекты valueOf
, поэтому сравниваются два примитива.
Если вы создадите два часа и установите их на одно и то же время, у вас будет два часа.
Если вы измените время в одних часах, время в других часах не изменится.
Чтобы сравнить или отсортировать даты, вычтите одно из другого. Значением объекта Date, используемого в математическом выражении, является его временная метка.
function compareDates (a, b) {return a-b};
Сравните две даты с помощью JavaScript
date.compare (a, b)
Дело в том, что сравнение двух объектов не работает должным образом: /