Как работает выражение +(++[[]][+[]]+[+[]])
Недавно столкнулся с очень странным выражением - +(++[[]][+[]]+[+[]]). Странно то, что оно ровно 10.
console.log(+(++[[]][+[]]+[+[]]))
Не смог разобраться как оно работает. Как вообще выражение из массивов и плюсов может быть ровно 10?
Ответы (1 шт):
Для того, чтобы разобраться как все работает, достаточно расставить скобочки и вычислить все выражения по порядку:
+(++([[]][(+[])])+[(+[])])
Отформатируем
+ ( // 5
++ ( // 3
[[]][ // 2
+[] // 1
]
)
+ [ // 4
+[] // 1
]
)
Рассмотрим по шагам:
+[]- унарный+переводит операнд в число. Пустой массив приводится к пустой строке, после этого пустая строка переводится в число0.+ ( // 5 ++ ( // 3 [[]][ // 2 0 ] ) + [ // 4 0 ] )[[]][0]- получение элемента массива по индексу. В данном случае вернется[]- нулевой элемент из[[]]+ ( // 5 ++ ( // 3 [] ) + [ // 4 0 ] )++ ([])- данный шаг выполняется вместе со вторым,[]одновременно приводится к0и увеличивается на1.+ ( // 5 1 + [ // 4 0 ] )1 + [0]- складываются разнородные операнды, второй приводится к'0'что равносильно складыванию числа и строки1 + '0', результат'10'+ ( // 5 '10' )+'10'- применение унарного плюса к строке, приводит ее к числу. Результат - 10