Ошибка weird / odd с проверкой jQuery в конце даты больше, чем дата начала [дубликат]

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

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

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 18 August 2018 в 09:55
поделиться
  • 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 18 August 2018 в 09:55
поделиться

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

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

var diff= (startDate1 -startDate2)

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

6
ответ дан kennebec 18 August 2018 в 09:55
поделиться
  • 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 18 August 2018 в 09:55
поделиться
Другие вопросы по тегам:

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