1. JavaScript / Говнокод #6514

    +158

    1. 1
    if(typeof n!="number"&&(k==Number||!(n instanceof Number))||p.round(n)!=n||n==NaN||n==Infinity)return!1;

    http://www.google-analytics.com/ga.js
    Инженеры в Гугле знают толк в JavaScript'e.

    Запостил: wvxvw, 29 Апреля 2011

    Комментарии (62) RSS

    • Кроссбраузерность же
      Ответить
    • n==NaN - это выражение всегда равно false. Если в каком-то браузере можно переопределить NaN, то может как-то и можно заставить это работать, но в браузерах, где я попробовал NaN==NaN при любых раскладах будет false. Всякие Number.NaN = 1 или window.NaN = 1 эффекта не дали :)
      Ответить
      • Во всех версиях браузеров пробовал?
        Ответить
        • Даж всякие неординарные (типа IE5 сборки AOL, Seamonkey, Konqueror, IE5 для OS8). Благо есть на чем пробовать :) А вообще мне не извесны баги isNaN() - у меня, конечно нет доступа к гугловкому баг трекеру, но скорее всего автору банально была неизвесна эта функция. В любом случае, если бы она была ему извесна, то, наверняка бы использовал.
          Ответить
        • чуть не заплакал... :D Не так проверял.
          window["NaN"] = 1;
          NaN==NaN;
          // true 
          isNaN(NaN);
          // false 
          1/0 == NaN;
          // false

          Хорошо что хоть цифры в яваскрипте переопределить нельзя :)
          Ответить
      • http://wtfjs.com/
        почитай, мудила.
        Ответить
        • Как-то вообще не в кассу... вы вообще уверены, что в нужную тему коммент запостили? NaN это значение, которое неявно в этом контексте ни к чему не приводится, константа, на которую вы никак не можете повлиять, только вызвать функцию, в которую вы ее передадите и она вам чего-нибудь другое вернет, например
          var a = function(x) { return "hello"; };
          a(NaN) == "hello";

          будет работать.
          Вы можете неявно привести NaN к строке, например: "" + NaN == "NaN" (Что тоже по-сути является вызовом функции конкатенации строк, с параметром NaN) - так можно. А NaN == NaN ни при каких раскладах работать не будет. Чтобы узнать является ли значение NaN нужно использовать специальную глобальную функцию isNaN(). Других вариантов нет. Так устроен стандарт IEEE-754 для чисел с плавающей запятой, ES-2 утверждает, что использует именно его.
          Ответить
          • В кассу, в кассу, там как раз рассматриваются такие случаи.
            Ответить
            • Ну, тогда вы просто с очень уверенным видом бредите... что вам еще сказать.
              Ответить
              • а вы сайт хоть открыли, милейший?или с английским проблемы?
                Ответить
                • На сайте есть пример, где NaN конвертируется в целое 32-битное число используя побитовое или, а потом над результатом производят еще дополнительные манипуляции. В контексте моего примера NaN не конвертируется ни во что. Оператор сравнения его ни во что не будет конвертировать. Так требует стандарт ES-2, который реализуют, ну, или по крайней мере обещают, всякие JavaScrip/JScript и т.п. Оператор - функция, но записаная в более "понятном" программисту виде, без "скобочек". Т.е. это пример из моего поста выше, где я говорил о том, что вы можете передать NaN в другую функцию, и она вам что-то вернет. Оператор нестрогого равенства, при условии, что один из операндов NaN всегда возвращает false - о чем я написал еще раньше. Если вы не можете это осознать - читайте документацию... Я не детский писатель, чтобы подробно и в иллюстрациях объяснять.
                  Ответить
                  • видимо школьник задел за живое, раз такие стены текста
                    Ответить
    • Ответить
    • А это что "return!1"?
      сокращения?
      Ответить
    • А так нельзя было?
      return (isFinite(n) && n===+n && !(n%1));


      Кстати, при n = -Infinity гугловский код вернет true.
      Ответить
      • Если чесно, я не совсем понимаю теперь, какого результата автор ожидал от своего кода. Сначала я подумал, что это просто плохая аналогия isNaN, но она не обрабатывает очень много вариантов, чтобы претендовать на аналогию. Поэтому я потом подумал, что может быть автор хотел узнать является ли тестируемое целым числом. Но тут тоже возникает вопрос, почему выбран такой диапазон значений. Тут скорее нужно не более оптимально решить то, что на самом деле делает код, а понять, что он должен был делать... Т.е. из возможных вариантов - может быть автор пытается проверить, что значение используемое для индекса массива впринципе допустимо (и просто забыл, что числа бывают еще и отрицательными) и т.п.
        Ответить

    Добавить комментарий