Pull to refresh

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

Reading time2 min
Views28K
Почему в 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
Tags:
Hubs:
+24
Comments15

Articles

Change theme settings