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

в 7:20, , рубрики: javascript, загадки, разбор

Почему в 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

И ведь с виду все правильно…

Автор: DennyRolling

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js