Сравнение дат в 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... он избыточен С ==, но он работает.