Сравнение дат в 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

почему?

4 ответов


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

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


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

даты.сравните (a, b)

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


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

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

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

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


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

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

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

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

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