Explanation: it's mostly due to how js does type conversion. for the Ls, it's
[] is an empty array
![] is treated as false
combining a boolean with the empty array returns "false" as a string (so true + [] = "true", false + [] = "false")
! + [] is treated as true
! + [] + ! + [] is treated as 2 since true + true = 1 + 1 = 2
so you have "false"[2], which is l
for the o it's
[] is an empty array
[] + {} returns "[object Object]" as a string ({} + [] returns 0)
![] is false
!![] is true
+!![] casts it to an integer
so that part is "[object Object]"[1], which returns "o"