Сравнение дат в JavaScript - PullRequest
11 голосов
/ 22 мая 2010

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

Почему?

Ответы [ 4 ]

28 голосов
/ 22 мая 2010

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

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

0 голосов
/ 12 ноября 2010

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

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

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

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

0 голосов
/ 22 мая 2010

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

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

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

функция compareDates (a, b) {return a-b};

0 голосов
/ 22 мая 2010

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

dates.compare (а, б)

Дело в том, что сравнение двух объектов не работает должным образом: /

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