What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wat' talk for CodeMash 2012? -
the 'wat' talk codemash 2012 points out few bizarre quirks ruby , javascript.
i have made jsfiddle of results @ http://jsfiddle.net/fe479/9/.
the behaviours specific javascript (as don't know ruby) listed below.
i found in jsfiddle of results didn't correspond in video, , not sure why. am, however, curious know how javascript handling working behind scenes in each case.
empty array + empty array [] + [] result: <empty string>
i quite curious +
operator when used arrays in javascript. matches video's result.
empty array + object [] + {} result: [object]
this matches video's result. what's going on here? why object. +
operator do?
object + empty array {} + [] result [object]
this doesn't match video. video suggests result 0, whereas [object].
object + object {} + {} result: [object][object]
this doesn't match video either, , how outputting variable result in 2 objects? maybe jsfiddle wrong.
array(16).join("wat" - 1) result: nannannannannannannannannannannannannannannannan
doing wat + 1 results in wat1wat1wat1wat1
...
i suspect straightforward behaviour trying subtract number string results in nan.
here's list of explanations results you're seeing (and supposed seeing). references i'm using ecma-262 standard.
[] + []
when using addition operator, both left , right operands converted primitives first (§11.6.1). per §9.1, converting object (in case array) primitive returns default value, objects valid
tostring()
method result of callingobject.tostring()
(§8.12.8). arrays same callingarray.join()
(§15.4.4.2). joining empty array results in empty string, step #7 of addition operator returns concatenation of 2 empty strings, empty string.[] + {}
similar
[] + []
, both operands converted primitives first. "object objects" (§15.2), again result of callingobject.tostring()
, non-null, non-undefined objects"[object object]"
(§15.2.4.2).{} + []
the
{}
here not parsed object, instead empty block (§12.1, @ least long you're not forcing statement expression, more later). return value of empty blocks empty, result of statement same+[]
. unary+
operator (§11.4.6) returnstonumber(toprimitive(operand))
. know,toprimitive([])
empty string, , according §9.3.1,tonumber("")
0.{} + {}
similar previous case, first
{}
parsed block empty return value. again,+{}
sametonumber(toprimitive({}))
, ,toprimitive({})
"[object object]"
(see[] + {}
). result of+{}
, have applytonumber
on string"[object object]"
. when following steps §9.3.1,nan
result:if grammar cannot interpret string expansion of stringnumericliteral, result of tonumber nan.
array(16).join("wat" - 1)
as per §15.4.1.1 , §15.4.2.2,
array(16)
creates new array length 16. value of argument join, §11.6.2 steps #5 , #6 show have convert both operands number usingtonumber
.tonumber(1)
1 (§9.3), whereastonumber("wat")
againnan
per §9.3.1. following step 7 of §11.6.2, §11.6.3 dictatesif either operand nan, result nan.
so argument
array(16).join
nan
. following §15.4.4.5 (array.prototype.join
), have calltostring
on argument,"nan"
(§9.8.1):if m nan, return string
"nan"
.following step 10 of §15.4.4.5, 15 repetitions of concatenation of
"nan"
, empty string, equals result you're seeing. when using"wat" + 1
instead of"wat" - 1
argument, addition operator converts1
string instead of converting"wat"
number, callsarray(16).join("wat1")
.
as why you're seeing different results {} + []
case: when using function argument, you're forcing statement expressionstatement, makes impossible parse {}
empty block, it's instead parsed empty object literal.
Comments
Post a Comment