2010 07 12 fail
Let's take the last post a step further:
console.log( (![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]] ) // "fail"
Breaking that mass of symbols into pieces we notices, that the following patten occurs often:
console.log( (![]+[]) ) // "false"
console.log( ![] ) // false
So we try adding []
to false
. But through a number of internal function calls( binary + Operator
-> ToPrimitive
-> [[DefaultValue]]
) we end up with converting the right operand to a String:
console.log( [].toString() ) // ""
console.log( (![]+[].toString()) ) // false + ""
Aha, so we are concatenating strings here! Now this is plain obvious! Moving on to the next bit:
console.log( [+[]] ) // [ 0]
console.log( +[] ) // 0
Thinking of a String
as an Array
we can access its first character via [0]
. So "false"[0]
returns "f"
.
I think you got the idea now and can figure out the rest by yourself!
Thanks to Mathias Bynens for pushing this out int the web.