В общем-то, именно то, сколько скрипт займёт оперативки при свой работе, в этом конкурсе никто и не меряет. Ограничение в 13 кб стоит скорее на сетевой трафик. Причем, что забавно, условия приближены к «боевым»: большая часть серверов отдаёт браузеру html, css и js сжатыми в Deflate.
Но зачем это нужно, если скачать пару сотен мегабайт уже не составляет труда?
Чем меньше по весу страница, тем быстрее она грузится. Само по себе ограничение вынуждает веб-программиста познакомиться с минификацией ресурсов и оптимизацией картинок, практикам широко распространённым в «продакшне». Кроме того, это повод научиться писать краткие изящные алгоритмы и лучше узнать как сам язык, так и API, представляемый браузерами. Так что, сплошная польза.
Тайл из 4 элементов («Жизнь») можно теоретически получить 8 разными способами, продумать всё это богатство алхимического выбора сложновато. Приходится по-Парацельсовски плодить гомункулюсов из семени и конского навоза.
Ну, во-первых, это хак. Изящный и, кстати, давно известный, но всё-таки хак.
И, кстати, помнится, то ли в старом файрфоксе, то ли в старом ИЕ комменты вырезались. На современных браузерах всё работает ок, но нет никакой гарантии, что так будет вечно. В спецификации английским по белому написано, что результат Function.prototype.toString — implementation specific.
Во-вторых, производительность. В то время, как люди меняю на jsperf микросекунды, тут накладные расходы на вызов функции и регулярку вообще не считаются.
Варианты выхода из ситуации:
Если вам нужно на стороне сервера сгенерировать что-либо в нотации JavaScript, можно использовать JSON. Даже само его название, «JavaScript Object Notation» как бы намекает. Тем более, поддерка на серверной стороне широчайшая — от PHP до Erlang,
Можно использовать экранирование символа переноса строки:
var myVar = "foo\
bar\
baz";
(Во, даже хабрапарсер правильно подсветил код!) Но предупреждаю, в спецификации про этот способ ни слова, опять-таки, 100% совместимость никто не гарантирует.
Вариант три: в ES6 уже есть поддержка строк с переносами. Вполне возможно, какой-нибудь Traceur это уже умеет.
Псевдоэлементы :before и :after по умолчанию имеют большее значение z-index, чем элемент, к которому они добавлены.
Псевдоэлементы :before и :after по умолчанию имеют значение z-index: auto, и ничем по поведению не отличаются от обычных дочерних элементов. Вы что-то неверно сформулировали?
Ваша правда. При достаточно расхлябанной защите можно и сейчас увести админские куки или открыть админку в ифрейме, а такой метод давал бы слишком много удобства.
Но с другой стороны можно заложить необходимость явного включения автообнаружения для каждой вкладки, скажем, не выполнил window.Domain.enableAutoDiscovery(true), ссылку из другого окна не получишь.
Ещё один минус межвкладочного взаимодействия через ссылку на другое окно — возможность создать адскую утечку памяти, от которой даже F5 не спасёт. Но тут уже надо программисту просто знать, что он делает.
От оно как! Надо с самопингующими вёркерами поэкспериментировать, спасибо. Видимо, у них какие-то особые привилегии.
Согласен, ситуция с шаредами аховая. Но какой-нибудь метод вроде window.getSameDomainWindows(), желательно синхронный, и парочка событий были бы даже лучше. Как вы думаете, может стоит сделать proposal какой-нибудь Мозилле?
На этот случай есть хак:
При открытии вкладки (или по другому событию) она меняет свой window.name на какую-нибудь псевдо-уникальную строку и отсылает её через localStorage. Другие вкладки (если есть) ловят onstorage и запускают var hWnd = window.open("", "{{имя окна}}"), получая ссылку на её window.
Тут есть, конечно, куча ограничений, и самое главное из них — мобильный сафари, он замораживает неактивную вкладку, так что onstorage (и, если мне не изменяет память, даже банальный setTimeout) не выполнится, пока она не станет активной. Выходом из этого могли бы быть Shared Workers, но они тоже были выпилены из этого чудесного браузера.
Как-то это неправильно. Не то, чтобы неэстетично, а вообще.
Держу пари, что если передать в качестве fn функцию, которая использует переменные из замыкания, на выходе получим трудноловимый баг.
А если таким аргументом будет любая функция, toString которой возращает "function () { [native code] }", например, результат Function.prototype.bind() в том же Хроме, результатом будет ошибка синтаксиса.
В Total Commander есть команды cm_CopyNamesToClip и cm_CopyFullNamesToClip. Я их себе назначил на Ctrl-G и Ctrl-Shift-G, и давно позабыл про подобные ухищрения c dir.
Кстати, в том же Sublime Text есть мультивыделение, которое позволяет делать многое вообще без регулярок.
Но зачем это нужно, если скачать пару сотен мегабайт уже не составляет труда?
Чем меньше по весу страница, тем быстрее она грузится. Само по себе ограничение вынуждает веб-программиста познакомиться с минификацией ресурсов и оптимизацией картинок, практикам широко распространённым в «продакшне». Кроме того, это повод научиться писать краткие изящные алгоритмы и лучше узнать как сам язык, так и API, представляемый браузерами. Так что, сплошная польза.
Но это всё следствия. А причина — «Just for fun».
И, кстати, помнится, то ли в старом файрфоксе, то ли в старом ИЕ комменты вырезались. На современных браузерах всё работает ок, но нет никакой гарантии, что так будет вечно. В спецификации английским по белому написано, что результат
Function.prototype.toString
— implementation specific.Во-вторых, производительность. В то время, как люди меняю на jsperf микросекунды, тут накладные расходы на вызов функции и регулярку вообще не считаются.
Варианты выхода из ситуации:
Если вам нужно на стороне сервера сгенерировать что-либо в нотации JavaScript, можно использовать JSON. Даже само его название, «JavaScript Object Notation» как бы намекает. Тем более, поддерка на серверной стороне широчайшая — от PHP до Erlang,
Можно использовать экранирование символа переноса строки:
(Во, даже хабрапарсер правильно подсветил код!) Но предупреждаю, в спецификации про этот способ ни слова, опять-таки, 100% совместимость никто не гарантирует.
Вариант три: в ES6 уже есть поддержка строк с переносами. Вполне возможно, какой-нибудь Traceur это уже умеет.
/regexp/.exec(fn.toString())
— это вообще в принципе не продакшн.Тут автор, похоже, под «shortcuts» имел в виду «keyboard shortcuts», «горячие клавиши».
Псевдоэлементы :before и :after по умолчанию имеют значение z-index: auto, и ничем по поведению не отличаются от обычных дочерних элементов. Вы что-то неверно сформулировали?
undefined
, который[][[]]
Как же? Практически один-в-один происходит в jsfuck.
Там
function
выдёргивается через[]["filter"]
, а сами символы f-i-l-t-e-r берутся изtrue
иfalse
, которые в свою очередь!![]
и![]
.Одна регулярка не поможет. А две — вполне.
Но с другой стороны можно заложить необходимость явного включения автообнаружения для каждой вкладки, скажем, не выполнил
window.Domain.enableAutoDiscovery(true)
, ссылку из другого окна не получишь.Ещё один минус межвкладочного взаимодействия через ссылку на другое окно — возможность создать адскую утечку памяти, от которой даже F5 не спасёт. Но тут уже надо программисту просто знать, что он делает.
—
f=30,g=Math.pow(2,f)-1
круто, но(1<<30)-1
короче.—
Math.floor(n)
для положительных чисел можно заменитьn|0
или~~n
—
for(w=2;5>=w;w++)
то же самое, чтоfor(w=1;5>w++;)
—
var a=0,b=0
можно сократить доa=b=0
(да, убрав var)Согласен, ситуция с шаредами аховая. Но какой-нибудь метод вроде
window.getSameDomainWindows()
, желательно синхронный, и парочка событий были бы даже лучше. Как вы думаете, может стоит сделать proposal какой-нибудь Мозилле?При открытии вкладки (или по другому событию) она меняет свой
window.name
на какую-нибудь псевдо-уникальную строку и отсылает её через localStorage. Другие вкладки (если есть) ловят onstorage и запускаютvar hWnd = window.open("", "{{имя окна}}")
, получая ссылку на её window.Тут есть, конечно, куча ограничений, и самое главное из них — мобильный сафари, он замораживает неактивную вкладку, так что onstorage (и, если мне не изменяет память, даже банальный setTimeout) не выполнится, пока она не станет активной. Выходом из этого могли бы быть Shared Workers, но они тоже были выпилены из этого чудесного браузера.
Как-то это неправильно. Не то, чтобы неэстетично, а вообще.
Держу пари, что если передать в качестве fn функцию, которая использует переменные из замыкания, на выходе получим трудноловимый баг.
А если таким аргументом будет любая функция,
toString
которой возращает"function () { [native code] }"
, например, результатFunction.prototype.bind()
в том же Хроме, результатом будет ошибка синтаксиса.Жаль, синтаксис не позволяет обернуть всё это в самовызывающуюся лямбду.
cm_CopyNamesToClip
иcm_CopyFullNamesToClip
. Я их себе назначил на Ctrl-G и Ctrl-Shift-G, и давно позабыл про подобные ухищрения c dir.Кстати, в том же Sublime Text есть мультивыделение, которое позволяет делать многое вообще без регулярок.
Минусы: обе эти утилиты, к сожалению, платные.