- 1
- 2
- 3
- 4
- 5
var n=7;
if(3 in [1..n]) {
// PROFIT!
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+164
var n=7;
if(3 in [1..n]) {
// PROFIT!
}
Замечательный способ писать заведомо ложное условие :D
Заведомо некомпилящееся?
> А проверить перед тем как писать?
Так проверял, но вот только зачем-то "упростил" код...
*ROFL*
Значит там дополнительный подвох для любителей рефакторить :D
Преждевременная оптимизация - зло. Дональд Эрвин Дак.
да, надо плюсануть
я сначала подумал, что этот код - очередной школобред, хорошо, что сначала обсуждение почитал
Ролик по теме: https://www.destroyallsoftware.com/talks/wat
Т. е. набрали {}+[] и получили 0, хотя на самом деле x={}+[] даёт "[object Object]". Если конкретнее, то в их записи не сложение объекта с массивом, а пустой блок кода и унарный плюс для массива.
А не знаете, зачем так сделано? Это как-то связано с авторасстановкой точек с запятой? Других сложностей для парсера не нахожу, а с виду логики в таком поведении мало.
{}+[] // 0
({}+[]) // "[object Object]"
1, {}+[] // "[object Object]"
{console.log("I'm not an object")}+[7]
({console.log("I'm not an object")}+[7]) // SyntaxError: Unexpected token .
Соответственно, если использовать {}+[] в выражении, ноль получаться не будет. Единственный способ получить 0 - написать это в основном потоке кода, но в таком случае присваивания быть не может, соответсвенно в скрипте этот 0 доступен не будет.
> Открой консоль браузера и набери поштучно эти строки, чтобы понять что происходит
Что происходит - понятно, что происходит - было хорошо описано в комментарии http://govnokod.ru/13865#comment197935.
Неясно, это из-за сложностей при создании парсера (если не ошибаюсь, +function f(){}() вытекает из-за подобных сложностей), или кто-то специально решил потроллить людей и вписал в это в стандарт.
Более того, в противном случае неясно как отличить объект от кода - не забываем про возможность использования меток. По-моему, если бы было иначе, то точно проблем была бы куча.
> +function f(){}()
Один из вариантов записи. Кстати, можно без имени.
Но обычно всё-таки ставят скобки. А в минимизированном варианте - логическое отрицание. Кстати, последний вариант делает код максимально безвредным.
Хех... Никогда не понимал логику авторов js. Ну вот не имеет операция смысла (например сложение массива и объекта)- ну верните, блджад, undefined какой-нибудь... Но нет, понагородили всяких мутных правил на все случаи жизни, по которым js может складывать что угодно с чем угодно... Я не понимаю в чем смысл...
Ничего не напоминает?
PS: Случайно разлогинился...
Сначала я даже подумал, что это какие-то фичи ES6 - скажем, spread call/spread array operator.
"undefined!!!"
O_0
хотя логично
255..toString(16)
"ff"
(По крайней мере, в одном языке)
никакой вставки неявных ';' не происходит, так что так писать можно и это будет работать так, как и ожидается. В языке какие-то неочевидные правила, когда неявные ';' вставляются, а когда - нет. Очевиднее всего было бы, если они совсем никогда не вставлялись (или, наоборот, всегда вставлялись, как, условно, в питоне).