/* * A random test based on a Slashdot comment :-) */ var res; /*=== 0 number ===*/ /* {} + [] parses as an empty block statement (!) followed by unary plus * and an array, and is equivalent to: * * {}; * +[]; * * where +[] evaluates to ToNumber([]): * * [] -> ToPrimitive([], hint Number) * -> [].[[DefaultValue]] (hint = Number) * -> Object.prototype.valueOf() -> returns [] itself, not primitive * -> Array.prototype.toString() * -> "" * -> 0 * * The coercion of an empty string or a string consisting only of * whitespace is 0 and not a NaN (!); see E5 Section 9.3.1. */ res = eval('{}+[]'); print(res, typeof res); /*=== [object Object] string [object Object] string ===*/ /* [] + {} parses as a binary addition. * * Each side is first coerced using ToPrimitive(): * * ToPrimitive({}) * -> {}.[[DefaultValue]] (no hint -> Number) * -> Object.prototype.valueOf() -> returns [] itself, not pritimive * -> Object.prototype.toString() * -> "[object Object]" * * ToPrimitive([]) * -> [].[[DefaultValue]] (no hint -> Number) * -> Object.prototype.valueOf() -> returns {} itself, not primitive * -> Array.prototype.toString() * -> "" * * So, [] + {} should yield "" + "[object Object]" == "[object Object]. * * Same goes for ({} + []) which is a binary addition expression because * of the parens. */ res = eval('[]+{}'); print(res, typeof res); res = eval('({}+[])'); print(res, typeof res);