Почему в JavaScript:

>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)


  1. moigagoo
    17.03.2016 10:45
    +38

    1. prefrontalCortex
      17.03.2016 14:25

      Нажал "читать далее" только чтобы увидеть этот комент.


    1. DennyRolling
      17.03.2016 19:17

      да, прекрасное, прекрасное видео! давно уже его смотрел, но с удовольствием пересмотрел еще раз.


  1. affka
    17.03.2016 11:23
    +13

    и главный вопрос — а нафига так делать!? %)


    1. Sirion
      17.03.2016 11:44
      +1

      Для обфускации, например.Где-то на хабре пылится статья про зловредный скрипт, не содержащий ни одного буквенно-цифрового символа, и его деобфускацию.



  1. Kolyuchkin
    17.03.2016 11:30
    +3

    «Повышение уровня „мелко-дисперсности“ оксида двухатомного водорода механическим способом» — из той же оперы)))


  1. vlreshet
    17.03.2016 13:27
    +6

    Сейчас меня закидают помидорами, но… это реально тянет на статью? Самое обычное, документированное поведения языка. Понятно что использовать такое в здравом уме и рассудке не стоит, но всё же.


  1. Infthi
    17.03.2016 13:50
    +1

    Тут должна быть вот эта ссылка: http://thedailywtf.com/articles/bidding-on-security


    1. DennyRolling
      17.03.2016 19:22

      добавил, спасибо!


  1. Semmaz
    17.03.2016 16:42
    +3

  1. Myshov
    17.03.2016 19:47
    +2

    Вот хороший доклад в тему про представление любого JS-кода в виде ограниченного набора символов


  1. XanderBass
    19.03.2016 23:12

    > и потом используют чтобы обойти фильтрацию по регулярным выражениям в eBay
    Я вот хотел матюкнуться на JSFuck, но получилось настолько длинно, что я в упор не понимаю, как можно использовать оное в практических целях, кроме разве что обфускации.


    1. DennyRolling
      21.03.2016 06:56

      и атак против запрещающих символьно-буквенный ввод регулярных выражений


  1. Xao
    22.03.2016 13:19

    >1+[[]+[]]-[]+[[]-[]]-1

    Мсье знает толк в brainfuck-коде.