Сравнение дат JavaScript

Почему оператор равенства возвращает 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

Почему?

Ответ 1

Поскольку даты являются встроенными объектами, а не примитивами, проверка равенства выполняется с использованием ссылок на объекты.

В этом случае объекты 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 объектов, и поэтому он сравнивается с двумя примитивами.

Ответ 3

Если вы создаете два такта и устанавливаете их оба в одно и то же время, у вас есть два часа.

Если вы измените время в один такт, это не изменит время на других часах.

Чтобы сравнить или отсортировать даты, вычтите один из другого. Значение объекта Date, используемого в математическом выражении, является его меткой времени.

function compareDates (a, b) {return a-b};

Ответ 4

Извините, ребята, но это идиотка... особенно бит о том, что у вас два часа.

==, по определению сравнивает значения VALUES, тогда как === сравнивает ссылки. Утверждение, что == fail для не-примитивов нарушает собственную синтаксическую структуру языка. Конечно, === не удалось в первом примере, так как две даты, очевидно, представляют собой два разных указателя на два разных пространства памяти, но, по самому определению спецификации JS, == должно возвращать TRUE для сравнения двух даты, значение которых совпадает с временем.

Еще одна причина, по которой я ненавижу JS...

Извините, что напомнил, но это просто ударило меня по заднице в течение часа.

Как и в стороне, вы можете использовать valueOf() для принудительного сравнения значений, и это вернет true... оно избыточно с помощью ==, но оно работает.