Почему оператор равенства возвращает 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
Почему?
Почему оператор равенства возвращает 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
объектов, и поэтому он сравнивается с двумя примитивами.
Сравните две даты с JavaScript
dates.compare(а, б)
Дело в том, что сравнение между двумя объектами не работает должным образом:/
Если вы создаете два такта и устанавливаете их оба в одно и то же время, у вас есть два часа.
Если вы измените время в один такт, это не изменит время на других часах.
Чтобы сравнить или отсортировать даты, вычтите один из другого. Значение объекта Date, используемого в математическом выражении, является его меткой времени.
function compareDates (a, b) {return a-b};
Извините, ребята, но это идиотка... особенно бит о том, что у вас два часа.
==, по определению сравнивает значения VALUES, тогда как === сравнивает ссылки. Утверждение, что == fail для не-примитивов нарушает собственную синтаксическую структуру языка. Конечно, === не удалось в первом примере, так как две даты, очевидно, представляют собой два разных указателя на два разных пространства памяти, но, по самому определению спецификации JS, == должно возвращать TRUE для сравнения двух даты, значение которых совпадает с временем.
Еще одна причина, по которой я ненавижу JS...
Извините, что напомнил, но это просто ударило меня по заднице в течение часа.
Как и в стороне, вы можете использовать valueOf() для принудительного сравнения значений, и это вернет true... оно избыточно с помощью ==, но оно работает.