I have tested the
            code:
{}+{} =
            NaN;
({}+{}) = "[object Object][object
            Object]";
Why does
            adding the () change the result?
Answer
{}+{} is a
            block followed by an expression. The first
            {} is the block (like the kind you attach to an
            if statement), the +{} is the
            expression. The first {} is a block because when the parser is
            looking for a statement and sees {, it interprets it as the
            opening of a block. That block, being empty, does nothing. Having processed the block,
            the parser sees the + and reads it as a unary
            +. That shifts the parser into handling an expression. In an
            expression, a { starts an object initializer instead of a
            block, so the {} is an object initializer. The object
            initializer creates an object, which + then tries to coerce to
            a number, getting
            NaN.
In
            ({}+{}), the opening ( shifts the
            parser into the mode where it's expecting an expression, not a statement. So the
            () contains two object initializers with a
            binary + (e.g., the "addition" operator,
            which can be arithmetic or string concatenation) between them. The binary
            + operator will attempt to add or concatenate depending on its
            operands. It coerces its operands to primitives, and in the case of
            {}, they each become the string "[object. So you end up with 
            Object]""[object Object][object, the result of concatenating them.
            Object]"
 
No comments:
Post a Comment