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”
The explanation is about as understandable as the JS code, however thanks OP, TIL
Iirc this is called “JSFuck”, and it has a number of compilers
The line breaks haven’t worked, here’s it formatted correctly:
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”-
Javascript might be the most widely-used scripting language in use today, due to its browser dominance. Most popular would imply that it’s not completely despised by everyone that has to use it, which is misleading. Even TypeScript tutorials are about 50% ‘you have to understand what Javascript does wrong here’.
That reads remarkably like a Whitehead theorem in Principia Mathematica.
Good reminder that no matter how deep in your programming career you are, there will always be a JS snippet you won’t be able to understand.
“Today we’re going to write our first program, and all it will do is print ‘hello world!’”
Everyone: oh, cool!
JS learners: fml
Don’t forget jsfuck