Как работает выражение +(++[[]][+[]]+[+[]])

Рейтинг: 8Ответов: 1Опубликовано: 19.02.2023

Недавно столкнулся с очень странным выражением - +(++[[]][+[]]+[+[]]). Странно то, что оно ровно 10.

console.log(+(++[[]][+[]]+[+[]]))

Не смог разобраться как оно работает. Как вообще выражение из массивов и плюсов может быть ровно 10?

Ответы

▲ 10Принят

Для того, чтобы разобраться как все работает, достаточно расставить скобочки и вычислить все выражения по порядку:

+(++([[]][(+[])])+[(+[])])

Отформатируем

+ ( // 5
  ++ ( // 3
    [[]][ // 2
      +[] // 1
    ]
  )
  + [ // 4
    +[] // 1 
  ]
)

Рассмотрим по шагам:

  1. +[] - унарный + переводит операнд в число. Пустой массив приводится к пустой строке, после этого пустая строка переводится в число 0.

    + ( // 5
      ++ ( // 3
        [[]][ // 2
          0
        ]
      )
      + [ // 4
        0
      ]
    )
    
  2. [[]][0] - получение элемента массива по индексу. В данном случае вернется [] - нулевой элемент из [[]]

    + ( // 5
      ++ ( // 3
        []
      )
      + [ // 4
        0
      ]
    )
    
  3. ++ ([]) - данный шаг выполняется вместе со вторым, [] одновременно приводится к 0 и увеличивается на 1.

    + ( // 5
      1
      + [ // 4
        0
      ]
    )
    
  4. 1 + [0] - складываются разнородные операнды, второй приводится к '0' что равносильно складыванию числа и строки 1 + '0', результат '10'

    + ( // 5
      '10'
    )
    
  5. +'10' - применение унарного плюса к строке, приводит ее к числу. Результат - 10