Puzzling JavaScript Behaviors in the 'Wat' Talk
The 'Wat' talk for CodeMash 2012 highlighted some peculiar behaviors in JavaScript, and it's worth exploring them to understand what's happening behind the scenes.
[] []
The addition operator ( ) used with empty arrays converts operands to primitives and joins them. As arrays' default primitive value is an empty string, the result of [] [] is an empty string.
[] {}
Objects in JavaScript have a toString() method that returns "[object Object]" when called. Thus, [] {} results in an object, specifically the string "[object Object]".
{} []
When used in a statement, {} is parsed as an empty block and thus returns undefined. The operator coerces undefined operands to numbers, resulting in 0 for {} [] (whereas the "Wat" talk mentions it should be NaN).
{} {}
Similar to {} [], the first {} is parsed as an empty block, resulting in undefined. However, the operator fails to coerce the string "[object Object]" (the toString() value of the second {}) to a number, resulting in NaN.
Array(16).join("wat" - 1)
ToNumber() converts "wat" - 1 to NaN, since subtracting a number from a string results in a non-numeric value. ToPrimitive() then converts NaN to the string "NaN", which is repeated 16 times when joining the array elements.
Conclusion
These seemingly bizarre behaviors stem from JavaScript's primitive conversion rules and the specific methods associated with arrays and objects. By understanding these underlying mechanisms, you can avoid unexpected results and harness the full power of JavaScript.
The above is the detailed content of Why Does JavaScript Produce Unexpected Results in These Strange Arithmetic Operations?. For more information, please follow other related articles on the PHP Chinese website!