войти зарегистрироваться

JavaScript whois

индекс
202,36

Побит рекорд самого короткого кода по определению IE

Без малого год назад, я уже писал (http://habrahabr.ru/blogs/javascript/50544/) о самом коротком способе определение браузера Internet Explorer, но вот некто Aleko нашел еще более короткий вариант:

-[1,]

Всего 5 байт. Пример использования:
if(-[1,]){
alert("Not IE!");
}

комментарии (76)

  • Может я что то не понимаю и у меня кривые руки, но я так и не смог нормально поставить линк на habrahabr.ru/blogs/javascript/50544/, по какой то неведомой причине, парсер переделывает его вот в это habrahabr.ru/blogs/javas&/#99;ript/50544/.
    • ну это издержки защиты ))
    • То же самое было в моих предыдущих топиках — пришлось ссылку приводить в тексте.
  • а для тех кто не силён в яваскрипте поясните пожалуйста )
    • раскрыть комментарий
      • ну я не настолько не компетентен и уж что такое alert знаю и что такое if else тоже )
        -[1,] — механизм вот этой штуки поясните и все.
        • Я так дума, что просто IE считает, что после «1» в массиве должен быть еще один элемент, ибо стоит запятая. А его нет.
          Другие браузеры не обращают внимания, а он — спотыкается.
          • *думаю :)
          • Железная логика =)
          • Именно так. Так же как IE выдаст ошибку и на такую конструкцию:
            {name1:val1,name2:val2,}
            • Нет, не так. Во первых IE не «спотыкается» на запятой, а считает её признаком ещё одного элемента, не более. Во вторых конструкция

              {name1:val1,name2:val2,}

              выдаст ошибку не из за запятой а из за того что в хэше, где используется сочетание ключ: значение в отличие от массивов, не будет найден очередной ключ.
          • спотыкается и выдает null или undefined, а минус перед массиво преобразует это в число. в ноль.

            В противном случае единственный элемент массива преобразуется в число и мы получаем -1, что в условии проходит.
        • Internet Explorer прибавляет пустой элемент массива к общему числу элементов.Типо странинный баг-фича.
        • Обычные браузеры при таком определении решат, что это число и получат "-1", а ИЕ — нет, поэтому он не сможет применить операцию "-". Как-то так, а по ссылке в посте все подробно расписано.
          • благодарю ) теперь логично ) а то минус к массиву мну просто смутил )
            • Если я не забыл все напрочь, для объекта-массива в таких случаях вызывается toString, который возвращает строку «1», которая конвертируется в число 1 для алгебраических операций. Вроде так. Гуру меня поправят.
        • Фишка в запятой после последнего элемента массива. По стандарту ECMAscript, одна запятая в конце игнорируется — это сделано для удобства записи в столбик, автогенерации и прочего. В Internet Explorer эта запятая добавляет пустой элемент. Итого во всех браузерах кроме internet explorer получится массив из одного числа. Минус перед массивом преобразует его в число. Массив из двух элементов, получившийся у Internet Explorer, в число не преобразуется, результатом будет значение «NaN», которое в условии «if» считается за «false». У всех остальных браузеров получится -1, которая считается за «true». Вот такие вот забавные документированные баги. Почему не убрали — непонятно :(.
          • спасибо ) старая привычка ms понимать стандарты по своему видать.
            • Здесь дело не в стандартах. В IE используется Jscript, в FF и Webkit — Javascript и только в Opera — ECMAscript. Так что если говорить про стандарты, то кроме Opera никто их не поддерживает.
          • > Вот такие вот забавные документированные баги. Почему не убрали — непонятно :(.
            Не убрали, чтобы самим быстро определять где же они, пользователи ИЕ :)
            • Ну почему же? Вполне стандартная политика Микрософта, заключается в следовании подходу «работает — не трожь». То есть вместо переписывания бажного куска они просто предлагают альтернативный вариант решения.
              Для обратной совместимости это хорошо, а вот в конечном счете для разработчиков системы это плоховато. Впрочем они обычно в случае, когда багов и хитроумных способов их обойти становится слишком много, просто предлагают перейти на новую технологию и начать с чистого листа.
          • Поясняю: «Массив из двух элементов, получившийся у Internet Explorer, в число не преобразуется» потому как при развертывании в IE мы получим не 1 а 1 с запятой, так как будет иметь место перечисление элементов — единицы и второго, несуществующего.
  • НЛО прилетело и опубликовало эту надпись здесь.
  • Никогда бы не подумал, спасибо. Сохранил.
    • По моему, проще запомнить %)
      • Зачастую, для современного человека эти два слова равнозначны :)
  • По ссылке на блог Aleko можно найти разъяснение механизма работы.
  • Красиво и бесполезно.
    • ну практически соглашусь… в 99% случаев требуется отличать какая именно версия ИЕ… а не то что это ИЕ вообще…
      да и экономия в один байт… нет я понимаю — сам программирую уже довольно давно… сидел и на 286-х и на спектруме — но при современных скоростях чтения-записи, объёмах винтов и памяти и ширинах каналов это капля в море.
      • это спорт, товарищи
        • интересно, а демосцена на яваскрипте есть?
          • Думаю, написание standalone букмарлетов близко по духу, там ограничение в ~2 кило символов.
            • Некоторые читерят с помощью createElement('script') ;)
              • не, это не спортивно :)
          • Есть
          • Есть! И ещё какая! Например, p01 взял старую 4к интруху «полет над Марсом» и засунул в 256b JS! Там битвы похлеще прежних (:
  • bash.org.ru цитата №97364
    В Опере есть возможность «Представиться как IE Explorer». Звучит как «Прикинуться дурачком»
    • Улыбнуло :)
    • раскрыть комментарий
      • также из-за одного неудачного комментария =)
        • мда… спасибо за минусы, но я имел в виду не столько этот комментарий))) no one cares…
          • Ну плюсы вроде как некультурно просить, не важно к какому топику\комментарию. :)
      • первое правило бойцовского клуба — никогда не рассказывать про бойцовский клуб:)
        тоже самое и с кармой)
    • к счастью всёже можно отличить Оперу в ИЕ моде, от ИЕ, по заголовкам…
      • А мы заголовки proxomitron-om подправим…
    • задумался над первой строкой…
      и вправду цитаты #97364 на bash.org.ru нету ;-)
  • Занятно, обычно я ссылаюсь на Хабр, а тут наоборот — копипастят у меня :) Приятно.
  • Пипец! Чем тупее бага, тем элегантней решение!
  • раскрыть комментарий
  • жму вашу руку.
  • Вспомнилось
    govnokod.ru/258
  • с одной стороны гениально. с другой, если завтра js в webkit или mozilla вдруг начнёт вести себя аналогичным образом, придётся всё переделывать. так что гениальность сродни баяну

    function getTomorrowDate() { sleep(86400); return strftime("%D"); }
    • Не начнут. Только MS нарушает стандарт ECMA (видимо, по историческим причинам — их реализация появилась еще до того, как стандарт устоялся, а «родная» совместимость дороже:). Скорее наоборот — IE9 или IE16 какой-нибудь могут начать приводить массивы по стандарту. Но тогда есть надежда, что и в остальном они будут вести себя как положено и отделять код для них и не понадобится…
  • До этого, помню, самый короткий код что я видел:

    if('\v' == 'v') { // IE

    }
  • Проверки основанные на ошибках, оригинально. К хорошему это не приводит. А на других, более серьезных языках автор данного варианта также программирует? Вот что интересно:-) Во многих компаниях за варнинги уже по голове не гладят, а тут такое. Да и почему только IE, многие вещи к примеру могут заработать во всех кроме FireFox или Opera, а бывают моменты, что для каждого браузера своя реализация нужна и куча подобных багов браузеров снесет башню новому программисту, которому придется курить код.
    • Угу. Решение из разряда сегодня работает, завтра не знаю. Выйдет какой-нить очередной патч или сервис-пак и вдруг работать перестанет.
    • Это же не production код, это лишь разминка для мозгов!
  • А мне кажется IE что-то заподозрит ))
  • Помнится у меня при такой ошибке не создавались обьекты. А в опере выдается ворнинг.
    • А в какой версии Opera выдавались предупреждения? Я проверял в 9 (кажется финальной девятой) и 10 версиях — хак не вызывал никаких отрицательных эмоций у браузера )
  • Красиво, но в последующих версиях IE может перестать работать.
    • Очень может быть, так как майкрософтовцы обещали сильно переписанный js движок в 9 IE, так что остается надеяться на то, что именно такие устоявшиеся безобидные помарки останутся.
      • На то, что движок допилят до такой степени соответствия стандартам, что отводить для него отдельную ветку кода просто не понадобится, надежды уже нет? :)
        • IE о как был ослом так ослом и останется. В этом я уверен практически полностью. Несоответствия будут всегда.
  • Кстати, обсуждение этой «фичи» (про добавление пустого элемента) было уже на хабре, странно, что только сейчас способ определения ИЕ через него придумали
    habrahabr.ru/blogs/javascript/67567/
  • То же самое, что определять марку машины вслепую по шершавости покрытия выхлопной трубы. Руки отрывать таким «умельцам». Есть штатные средства для определения, чем не устраивают?
    • Не устраивают штатные средства как раз тем, что они штатные (и зачастую очень уж некомпактные). Писать такие хаки — спорт и искусство. Мне это доставляет удовольствие.
  • Большое спасибо всем за комментарии. К сожалению инвайт я получил только сейчас и не успел отписаться первым.
  • Я так понимаю, что это работает на всех версиях ИЕ?
    • Точно) Я проверил на всех версиях, а так же в последних версиях Safari, FF, Chrome, Opera.
  • Я предпочитаю скрипт для IE грузить на уровне заголовка страницы.
    Если IE — грузим ie.js
    ИМХО — так проще…
    Зачем другим браузерам вообще парсить и грузить код, который нужен експлореру?

    хотя определение — зачетное… правда прослужит ли оно в новых експлорерах?
  • B=(function x(){})[-5]=='x'?'FF3':(function x(){})[-6]=='x'?'FF2':/a/[-1]=='a'?'FF':'\v'=='v'?'IE':/a/.__proto__=='//'?'Saf':/s/.test(/a/.toString)?'Chr':/^function \(/.test([].sort)?'Op':'Unknown'

    не короткий, но голову можно сломать :)
  • А если убрать знак восклицания и написать просто «Ne IE» то будет еще короче!!1
    • Вы вообще пост читали?
      • А разве надо было? Блин, я забыл.
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.