Почему в JavaScript:
Вообще трудно с первого взгляда понять почему так.
Что, думаете
А вот и нет:
Но мы же знаем что при прибавлении к строчке в JS происходит конкатенация, и казалось бы тогда первое выражение должно бы быть 99:
Как же так?
Придется разбирать с начала, сначала про два нуля:
Тут понятно, пустые массивы превратились в пустые строчки и сложившись породили пустую строку.
Тут тоже понятно, если разобраться что второй пустой массив это с точки зрения арифметики ноль, и пустая строка (к которой приводится для арифметики первый массив) тоже ноль. Ноль минус ноль, пока имеет смысл. Так же сразу становится понятна вторая часть:
Значит у нас есть обычный ноль, и ноль в массиве, складывая они приводятся к строчкам и конкатенируются:
С двойным зеро все понятно. Откуда взялось 9?
Читаем сложение, как положено, слева направо:
С большим количеством квадратных скобок мы уже разбирались, массив с пустой строкой привелся к пустой строке и превратил целую единицу в единицу-строчку...
… а потом вычитание нуля превратило ее назад в целое число.
Набор квадратных скобок справа равен ["0"], что превращается в строчное представление массива, и дописывается к единице, которая опять для этого превратилась в строчку.
И финальный аккорд совсем очевиден:
И ведь с виду все правильно...
А вообще люди делают полный язык на интерпретаторе Javascript используя только символы скобочек, восклицательный знак и плюс: http://www.jsfuck.com/ и потом используют чтобы обойти фильтрацию по регулярным выражениям в eBay: http://thedailywtf.com/articles/bidding-on-security
>1+[[]+[]]-[]+[[]-[]]-1
9
Вообще трудно с первого взгляда понять почему так.
Что, думаете
[[]+[]]-[]+[[]-[]]==9
?А вот и нет:
> [[]+[]]-[]+[[]-[]]
"00"
Но мы же знаем что при прибавлении к строчке в JS происходит конкатенация, и казалось бы тогда первое выражение должно бы быть 99:
> 1+"00"-1
99
Как же так?
Придется разбирать с начала, сначала про два нуля:
> []+[]
""
Тут понятно, пустые массивы превратились в пустые строчки и сложившись породили пустую строку.
> [""]-[]
0
Тут тоже понятно, если разобраться что второй пустой массив это с точки зрения арифметики ноль, и пустая строка (к которой приводится для арифметики первый массив) тоже ноль. Ноль минус ноль, пока имеет смысл. Так же сразу становится понятна вторая часть:
> [[]-[]]
[0]
Значит у нас есть обычный ноль, и ноль в массиве, складывая они приводятся к строчкам и конкатенируются:
> 0+[0]
"00"
С двойным зеро все понятно. Откуда взялось 9?
Читаем сложение, как положено, слева направо:
> 1+[[]+[]]
"1"
С большим количеством квадратных скобок мы уже разбирались, массив с пустой строкой привелся к пустой строке и превратил целую единицу в единицу-строчку...
> "1"-[]
1
… а потом вычитание нуля превратило ее назад в целое число.
> 1+[[]-[]]
"10"
Набор квадратных скобок справа равен ["0"], что превращается в строчное представление массива, и дописывается к единице, которая опять для этого превратилась в строчку.
И финальный аккорд совсем очевиден:
> "10"-1
9
И ведь с виду все правильно...
А вообще люди делают полный язык на интерпретаторе Javascript используя только символы скобочек, восклицательный знак и плюс: http://www.jsfuck.com/ и потом используют чтобы обойти фильтрацию по регулярным выражениям в eBay: http://thedailywtf.com/articles/bidding-on-security
Комментарии (15)
Kolyuchkin
17.03.2016 11:30+3«Повышение уровня „мелко-дисперсности“ оксида двухатомного водорода механическим способом» — из той же оперы)))
vlreshet
17.03.2016 13:27+6Сейчас меня закидают помидорами, но… это реально тянет на статью? Самое обычное, документированное поведения языка. Понятно что использовать такое в здравом уме и рассудке не стоит, но всё же.
Infthi
17.03.2016 13:50+1Тут должна быть вот эта ссылка: http://thedailywtf.com/articles/bidding-on-security
Myshov
17.03.2016 19:47+2Вот хороший доклад в тему про представление любого JS-кода в виде ограниченного набора символов
XanderBass
19.03.2016 23:12> и потом используют чтобы обойти фильтрацию по регулярным выражениям в eBay
Я вот хотел матюкнуться на JSFuck, но получилось настолько длинно, что я в упор не понимаю, как можно использовать оное в практических целях, кроме разве что обфускации.
moigagoo
WAT
prefrontalCortex
Нажал "читать далее" только чтобы увидеть этот комент.
DennyRolling
да, прекрасное, прекрасное видео! давно уже его смотрел, но с удовольствием пересмотрел еще раз.