Это потому, что во втором случае сравниваются фактические объекты даты, а два объекта никогда не равны друг другу. Поверните их в число:
alert( +startDate2 == +startDate3 ); // true
Если вы хотите более простое преобразование в число, используйте либо:
alert( startDate2.getTime() == startDate3.getTime() ); // true
, либо
alert( Number(startDate2) == Number(startDate3) ); // true
Oh , ссылка на спецификацию: §11.9.3 Алгоритм сравнения абстрактного равенства , который в основном говорит при сравнении объектов, obj1 == obj2
является истинным, только если они относятся к одному и тому же объекту, иначе результат будет ложным.