Вы должны понять несколько важных вещей о свободной типизации в JavaScript. Давайте начнем с более простых вещей, специфичных для вашего вопроса.
Пустой массив буквальный считаются truthy, но при применении унарного оператора +, массив будет преобразован в строку и которые затем будут преобразованы в число. Таким образом, внутренне +[]
имеет значение 0.
console.log(+[]);
// 0
С []
является truthy, двойное отрицание его логического оператора не даст вам true
, который при использовании в арифметическом выражении, оценки 1, так как 1 неплотно равна до true
.
console.log(!![], 3 + !![]);
// true 4
Помимо всего этого, когда мы используем литерал массива с +
оператором, массив будет преобразован в строку и так как одна часть выражения является строка, другая часть выражения также будет преобразование в строку и конкатенацию строк. Таким образом, результирующий объект будет иметь строку типа.
console.log(typeof 1, typeof [], typeof (1 + []), 1 + []);
// number object string 1
С этим основным пониманием, позволяет анализировать первое выражение.
+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]))
Давайте сначала взять,
(!+[]+!![]+!![]+!![]+[])
Здесь +[]
вычисляет 0
и логична, не делает его как true
. Поскольку мы используем его в выражении с числовым операндом, true
рассматривается как 1. И согласно нашей точке 2, приведенной выше, !![]
оценивает 1. Таким образом, выражение становится 1 + 1 + 1 + 1 + []
, которое на самом деле 4 + []
. И в соответствии с пунктом 3, число 4 будет строка 4.
Точно так же, другая часть выражения, (!+[]+!![]+!![])
становится 1 + 1 + 1
и что на самом деле 3. Итак, когда вы делаете '4' + 3
, вы получите '43'
, который это строка. Теперь у нас есть унарный + оператор, который преобразует эту строку в число. Итак, результатом оценки этого выражения становится 43, что является числом.
Другая часть выражения,
PgrtiJr.TWfbR -= +((+!![]+[])+(+!![]))
будут оценены как этот
+((1 + []) + 1)
, а затем
+('1' + 1)
, а затем
+'11'
, который затем оценивается как 11. Поскольку PgrtiJr.TWfbR
на самом деле 43, 43 - 11 становится 32. Вот почему вы получаете 32 в качестве ответа.