JavaScript

индекс
246,16

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

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

-[1,]

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

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

+9
Slon #
Может я что то не понимаю и у меня кривые руки, но я так и не смог нормально поставить линк на habrahabr.ru/blogs/javascript/50544/, по какой то неведомой причине, парсер переделывает его вот в это habrahabr.ru/blogs/javas&/#99;ript/50544/.
+8
SKYnv #
ну это издержки защиты ))
0
sashaeve #
То же самое было в моих предыдущих топиках — пришлось ссылку приводить в тексте.
+8
SKYnv #
а для тех кто не силён в яваскрипте поясните пожалуйста )
–43
Slon #
А для тех кто не силён в яваскрипте, это как бы и не имеет особой силы =)
В описанном выше примере сообщение «Not IE!» появится только в случае… если броузер не IE.
+49
SKYnv #
ну я не настолько не компетентен и уж что такое alert знаю и что такое if else тоже )
-[1,] — механизм вот этой штуки поясните и все.
+7
Fr3nzy #
Я так дума, что просто IE считает, что после «1» в массиве должен быть еще один элемент, ибо стоит запятая. А его нет.
Другие браузеры не обращают внимания, а он — спотыкается.
+3
Fr3nzy #
*думаю :)
0
warmaxx #
Железная логика =)
+2
Napolsky #
Именно так. Так же как IE выдаст ошибку и на такую конструкцию:
{name1:val1,name2:val2,}
+2
Aleko #
Нет, не так. Во первых IE не «спотыкается» на запятой, а считает её признаком ещё одного элемента, не более. Во вторых конструкция

{name1:val1,name2:val2,}

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

В противном случае единственный элемент массива преобразуется в число и мы получаем -1, что в условии проходит.
+4
NikitaG #
Internet Explorer прибавляет пустой элемент массива к общему числу элементов.Типо странинный баг-фича.
+7
lunatik42 #
Обычные браузеры при таком определении решат, что это число и получат "-1", а ИЕ — нет, поэтому он не сможет применить операцию "-". Как-то так, а по ссылке в посте все подробно расписано.
0
SKYnv #
благодарю ) теперь логично ) а то минус к массиву мну просто смутил )
НЛО прилетело и опубликовало эту надпись здесь
+70
eyeofhell #
Фишка в запятой после последнего элемента массива. По стандарту ECMAscript, одна запятая в конце игнорируется — это сделано для удобства записи в столбик, автогенерации и прочего. В Internet Explorer эта запятая добавляет пустой элемент. Итого во всех браузерах кроме internet explorer получится массив из одного числа. Минус перед массивом преобразует его в число. Массив из двух элементов, получившийся у Internet Explorer, в число не преобразуется, результатом будет значение «NaN», которое в условии «if» считается за «false». У всех остальных браузеров получится -1, которая считается за «true». Вот такие вот забавные документированные баги. Почему не убрали — непонятно :(.
+2
SKYnv #
спасибо ) старая привычка ms понимать стандарты по своему видать.
+1
Aux #
Здесь дело не в стандартах. В IE используется Jscript, в FF и Webkit — Javascript и только в Opera — ECMAscript. Так что если говорить про стандарты, то кроме Opera никто их не поддерживает.
+2
the_ghost #
> Вот такие вот забавные документированные баги. Почему не убрали — непонятно :(.
Не убрали, чтобы самим быстро определять где же они, пользователи ИЕ :)
+1
Gorthauer87 #
Ну почему же? Вполне стандартная политика Микрософта, заключается в следовании подходу «работает — не трожь». То есть вместо переписывания бажного куска они просто предлагают альтернативный вариант решения.
Для обратной совместимости это хорошо, а вот в конечном счете для разработчиков системы это плоховато. Впрочем они обычно в случае, когда багов и хитроумных способов их обойти становится слишком много, просто предлагают перейти на новую технологию и начать с чистого листа.
+1
Aleko #
Поясняю: «Массив из двух элементов, получившийся у Internet Explorer, в число не преобразуется» потому как при развертывании в IE мы получим не 1 а 1 с запятой, так как будет иметь место перечисление элементов — единицы и второго, несуществующего.
+6
egor1989 #
додумываются же
+2
FTM #
Никогда бы не подумал, спасибо. Сохранил.
+4
Halt #
По моему, проще запомнить %)
+1
rufus #
Зачастую, для современного человека эти два слова равнозначны :)
+2
Zubchick #
По ссылке на блог Aleko можно найти разъяснение механизма работы.
–2
kykapa4a #
Красиво и бесполезно.
0
Steward #
ну практически соглашусь… в 99% случаев требуется отличать какая именно версия ИЕ… а не то что это ИЕ вообще…
да и экономия в один байт… нет я понимаю — сам программирую уже довольно давно… сидел и на 286-х и на спектруме — но при современных скоростях чтения-записи, объёмах винтов и памяти и ширинах каналов это капля в море.
+20
romy4 #
это спорт, товарищи
+3
Agent_Smith #
интересно, а демосцена на яваскрипте есть?
+2
hyborg #
Думаю, написание standalone букмарлетов близко по духу, там ограничение в ~2 кило символов.
0
konfuze #
Некоторые читерят с помощью createElement('script') ;)
0
hyborg #
не, это не спортивно :)
+1
XPilot #
0
Aux #
Есть! И ещё какая! Например, p01 взял старую 4к интруху «полет над Марсом» и засунул в 256b JS! Там битвы похлеще прежних (:
+28
RedricShuhart #
bash.org.ru цитата №97364
В Опере есть возможность «Представиться как IE Explorer». Звучит как «Прикинуться дурачком»
0
conturov #
Улыбнуло :)
–42
RedricShuhart #
даже не просьба, скорее напоминание… если вам понравился коммент — плюсаните и в карму: это очень поможет тем, кто оказался не удел из-за одного неудачного топика.
+8
hulinada #
также из-за одного неудачного комментария =)
+4
RedricShuhart #
мда… спасибо за минусы, но я имел в виду не столько этот комментарий))) no one cares…
+6
reffy #
Ну плюсы вроде как некультурно просить, не важно к какому топику\комментарию. :)
+6
ekkeirsp #
первое правило бойцовского клуба — никогда не рассказывать про бойцовский клуб:)
тоже самое и с кармой)
0
Flcn #
к счастью всёже можно отличить Оперу в ИЕ моде, от ИЕ, по заголовкам…
0
mihmig #
А мы заголовки proxomitron-om подправим…
НЛО прилетело и опубликовало эту надпись здесь
0
RedricShuhart #
она есть в лучшем
+18
SamDark #
Занятно, обычно я ссылаюсь на Хабр, а тут наоборот — копипастят у меня :) Приятно.
0
pcmaniac #
Пипец! Чем тупее бага, тем элегантней решение!
–15
Glook #
Ещё короче: if IE — nooo!
)
0
Xenkok #
жму вашу руку.
+1
Gorthauer87 #
Вспомнилось
govnokod.ru/258
0
disserman #
с одной стороны гениально. с другой, если завтра js в webkit или mozilla вдруг начнёт вести себя аналогичным образом, придётся всё переделывать. так что гениальность сродни баяну

function getTomorrowDate() { sleep(86400); return strftime("%D"); }
НЛО прилетело и опубликовало эту надпись здесь
0
burivuh #
До этого, помню, самый короткий код что я видел:

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

}
+2
AxisPod #
Проверки основанные на ошибках, оригинально. К хорошему это не приводит. А на других, более серьезных языках автор данного варианта также программирует? Вот что интересно:-) Во многих компаниях за варнинги уже по голове не гладят, а тут такое. Да и почему только IE, многие вещи к примеру могут заработать во всех кроме FireFox или Opera, а бывают моменты, что для каждого браузера своя реализация нужна и куча подобных багов браузеров снесет башню новому программисту, которому придется курить код.
+1
Stepanow #
Угу. Решение из разряда сегодня работает, завтра не знаю. Выйдет какой-нить очередной патч или сервис-пак и вдруг работать перестанет.
+3
Gorthauer87 #
Это же не production код, это лишь разминка для мозгов!
0
YaMars #
А мне кажется IE что-то заподозрит ))
0
Makor #
Помнится у меня при такой ошибке не создавались обьекты. А в опере выдается ворнинг.
0
Aleko #
А в какой версии Opera выдавались предупреждения? Я проверял в 9 (кажется финальной девятой) и 10 версиях — хак не вызывал никаких отрицательных эмоций у браузера )
+1
twi #
Красиво, но в последующих версиях IE может перестать работать.
0
Aleko #
Очень может быть, так как майкрософтовцы обещали сильно переписанный js движок в 9 IE, так что остается надеяться на то, что именно такие устоявшиеся безобидные помарки останутся.
НЛО прилетело и опубликовало эту надпись здесь
–1
Aleko #
IE о как был ослом так ослом и останется. В этом я уверен практически полностью. Несоответствия будут всегда.
0
chEbba #
Кстати, обсуждение этой «фичи» (про добавление пустого элемента) было уже на хабре, странно, что только сейчас способ определения ИЕ через него придумали
habrahabr.ru/blogs/javascript/67567/
0
Denisio #
То же самое, что определять марку машины вслепую по шершавости покрытия выхлопной трубы. Руки отрывать таким «умельцам». Есть штатные средства для определения, чем не устраивают?
0
Aleko #
Не устраивают штатные средства как раз тем, что они штатные (и зачастую очень уж некомпактные). Писать такие хаки — спорт и искусство. Мне это доставляет удовольствие.
–2
Aleko #
Большое спасибо всем за комментарии. К сожалению инвайт я получил только сейчас и не успел отписаться первым.
0
tgm #
Я так понимаю, что это работает на всех версиях ИЕ?
+1
Aleko #
Точно) Я проверил на всех версиях, а так же в последних версиях Safari, FF, Chrome, Opera.
+1
podarokua #
Я предпочитаю скрипт для IE грузить на уровне заголовка страницы.
Если IE — грузим ie.js
ИМХО — так проще…
Зачем другим браузерам вообще парсить и грузить код, который нужен експлореру?

хотя определение — зачетное… правда прослужит ли оно в новых експлорерах?
+1
vtx #
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'

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

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.