Невозможно найти дату в массиве дат в JavaScript [duplicate]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

65
задан Rimian 1 October 2014 в 07:04
поделиться

4 ответа

Это потому, что во втором случае сравниваются фактические объекты даты, а два объекта никогда не равны друг другу. Поверните их в число:

 alert( +startDate2 == +startDate3 ); // true

Если вы хотите более простое преобразование в число, используйте либо:

 alert( startDate2.getTime() == startDate3.getTime() ); // true

, либо

 alert( Number(startDate2) == Number(startDate3) ); // true

Oh , ссылка на спецификацию: §11.9.3 Алгоритм сравнения абстрактного равенства , который в основном говорит при сравнении объектов, obj1 == obj2 является истинным, только если они относятся к одному и тому же объекту, иначе результат будет ложным.

105
ответ дан alex 19 August 2018 в 10:03
поделиться
  • 1
    @AndrewD. использование строгого равенства в этом конкретном случае не влияет на результаты, это связано с тем, что оператор equals в примерах всегда имеет дело с операндами того же типа, @RobG преобразует значения явно в Number (пример 1 и 3) или в примере 2, мы знаем, что Date.prototype.getTime всегда будет возвращать Number ... – CMS 30 September 2011 в 08:25
  • 2
    FYI, существует значительная разница в производительности между этими подходами: jsperf.com/date-equality-comparison – Nick Zalutskiy 13 January 2013 в 03:13
  • 3
    @ Ник - даже самая медленная версия занимает меньше микросекунды, поэтому, хотя существуют сравнительные различия, в абсолютном выражении разница в производительности незначительна. OP должен выбрать только тот подход, который подходит наилучшим образом, вероятно, использование getTime лучше всего для ясности (и, как оказалось, это самый быстрый вариант в проверенных мной браузерах). – RobG 14 January 2013 в 07:30
  • 4
    @RobG Вы знаете, вы абсолютно правы. =) Я писал библиотеку и делал тест «просто потому, что». В реальном программном обеспечении это не имеет никакого значения. – Nick Zalutskiy 15 January 2013 в 07:12
  • 5

вы можете сравнить фактические миллисекунды:

alert(startDate2.getTime() === startDate3.getTime());
4
ответ дан gion_13 19 August 2018 в 10:03
поделиться

Вам не нужно использовать метод getTime - вы можете вычесть объект даты из другого объекта даты. Он будет возвращать разницу в миллисекундах (отрицательная, если вторая - более поздняя дата)

var startDate1 = new Date("02/10/2012");
var startDate2 = new Date("01/10/2012");

var diff= (startDate1 -startDate2)

// оценивается в 0, если даты имеют одинаковую метку времени

6
ответ дан kennebec 19 August 2018 в 10:03
поделиться
  • 1
    +1 простое и изящное, предпочтительное решение: это использует встроенную функцию оценки даты без необходимости принуждения к числовой метке времени – gdibble 5 January 2016 в 23:25

Сравнение дат, использующих getTime(), возвращающее число миллисекунд из эпохи (т. е. число):

var startDate1 = new Date("02/10/2012");
var startDate2 = new Date("01/10/2012");
var startDate3 = new Date("01/10/2012");
alert(startDate1.getTime() > startDate2.getTime()); // true
alert(startDate2.getTime() == startDate3.getTime()); //true

Также рассмотрите использование конструктора Date с использованием явного числа year / month / date, а затем полагаясь на строковое представление (см. Date.parse () ). И помните, что даты в JavaScript всегда отображаются с использованием часового пояса клиента (браузера).

19
ответ дан Tomasz Nurkiewicz 19 August 2018 в 10:03
поделиться
  • 1
    +1 для комментария об использовании строк в качестве аргумента Date (). – RobG 30 September 2011 в 08:56
Другие вопросы по тегам:

Похожие вопросы: