this post was submitted on 19 Jul 2023
344 points (97.5% liked)

Programmer Humor

19747 readers
12 users here now

Welcome to Programmer Humor!

This is a place where you can post jokes, memes, humor, etc. related to programming!

For sharing awful code theres also Programming Horror.

Rules

founded 2 years ago
MODERATORS
 

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"

you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 143 points 1 year ago (4 children)

The explanation is about as understandable as the JS code, however thanks OP, TIL

[–] [email protected] 40 points 1 year ago* (last edited 1 year ago)

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"-
[–] [email protected] 23 points 1 year ago

Iirc this is called "JSFuck", and it has a number of compilers

[–] [email protected] 13 points 1 year ago* (last edited 1 year ago)

The idea behind it is not that complicated to explain... They set up a construct that spits out the word "false" and one that spits out "[object Object]". Taking the character with the Index of 2 from "false" gives us the "l" (the "2" to use as the index is of course also created using only brackets and parentheses). The character with the index of 1 from "[object Object]" is "o". So we have everything we need to spell out "lol".

[–] [email protected] 7 points 1 year ago (1 children)

There's a nice presentation that explains this behaviour quite understandable: https://youtu.be/sRWE5tnaxlI

[–] [email protected] 7 points 1 year ago

Here is an alternative Piped link(s): https://piped.video/sRWE5tnaxlI

Piped is a privacy-respecting open-source alternative frontend to YouTube.

I'm open-source, check me out at GitHub.