Я добавлю примечание, которое в 99% веб-приложений, даже ajax тяжелые приложения, скорость соединения и ответ веб-сервера собирается определить эффективность Вашего приложения, а не JavaScript. Я не говорю, что Вы должны записать намеренно медленный код или что обычно быть знающим, какие вещи, вероятно, будут быстрее, чем другие, не хорошо.
, Но я задаюсь вопросом, пытаетесь ли Вы решить проблему, которая еще действительно не существует, или даже если Вы оптимизируете для чего-то, что могло бы изменение в ближайшем будущем (скажите, если больше людей начинает использовать браузер, который поддерживает getElementsByClassName()
, функция упомянула ранее), делая Ваш оптимизированный код на самом деле выполненным медленнее.
Ответ @ Shoover правильный (прочтите его!), Но здесь есть кое-что еще.
В качестве javadoc для Double: : equals
утверждает:
«Это определение позволяет хеш-таблицам работать должным образом».
Предположим, что разработчики Java решили реализовать equals (...)
и compare (...)
с той же семантикой, что и ==
в обернутых экземплярах double
. Это означало бы, что equals ()
всегда будет возвращать false
для обернутого NaN. Теперь подумайте, что произойдет, если вы попытаетесь использовать обернутый NaN в карте или коллекции.
List<Double> l = new ArrayList<Double>();
l.add(Double.NaN);
if (l.contains(Double.NaN)) {
// this wont be executed.
}
Map<Object,String> m = new HashMap<Object,String>();
m.put(Double.NaN, "Hi mum");
if (m.get(Double.NaN) != null) {
// this wont be executed.
}
В этом нет большого смысла!
Другие аномалии могут существовать, потому что -0,0
и +0.
Заслуга в том, что это самый простой код, который выполняет
Одной из общих черт начинающих программистов является переоценка чтения исходного кода и недооценка чтения спецификаций . В этом случае спецификация:
http://java.sun.com/javase/6/docs/api/java/lang/Double.html#compareTo%28java.lang.Double%29
.. ... делает поведение и причину поведения (согласованность с equals ()) совершенно ясными.
Объяснение находится в комментариях в коде. В Java есть значения типа double для 0,0
и -0,0
, а также для «не числа» ( NaN
). Для этих значений нельзя использовать простой оператор ==
. Взгляните на источник doubleToLongBits ()
и на документацию Javadoc для метода Double.equals ()
:
Обратите внимание, что в большинстве случаев для два экземпляры класса
Double
,d1
иd2
, значениеd1.equals (d2)
равноистина
, если и только еслиd1.doubleValue () == d2.doubleValue ()
также имеет значение
истина
. Однако, есть два исключения:
- Если
d1
иd2
оба представляютDouble.NaN
, то метод equals возвращаетtrue
, даже хотяDouble.NaN == Double.NaN
имеет значениеfalse
.- Если
d1
представляет+0,0
, аd2
представляет-0,0
, или наоборот, проверка равенства имеет значениеложь
, хотя+0,0 == -0,0
имеет значениеtrue
.Это определение позволяет хеш-таблицам работать должным образом.
Эта реализация позволяет определять действительное число как