Занимательный разбор одного выражения с квадратными скобками

    Почему в 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
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 15

      +38
        0
        Нажал "читать далее" только чтобы увидеть этот комент.
          0
          да, прекрасное, прекрасное видео! давно уже его смотрел, но с удовольствием пересмотрел еще раз.
          +13
          и главный вопрос — а нафига так делать!? %)
            +1
            Для обфускации, например.Где-то на хабре пылится статья про зловредный скрипт, не содержащий ни одного буквенно-цифрового символа, и его деобфускацию.
              +3
              +3
              «Повышение уровня „мелко-дисперсности“ оксида двухатомного водорода механическим способом» — из той же оперы)))
                +6
                Сейчас меня закидают помидорами, но… это реально тянет на статью? Самое обычное, документированное поведения языка. Понятно что использовать такое в здравом уме и рассудке не стоит, но всё же.
                  +1
                  Тут должна быть вот эта ссылка: http://thedailywtf.com/articles/bidding-on-security
                    0
                    добавил, спасибо!
                    +3
                      +2
                      Вот хороший доклад в тему про представление любого JS-кода в виде ограниченного набора символов

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

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

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

                          Самое читаемое