I was reading the answer to this question (about the "wat" video) and it said:
{}+[]
I am currently learning JS from "The Definitive Guide" so I try to really understand things like that.
My question is, when does JS decide to interpret {}
as an empty block of code, instead of an empty object?
Also, there are some inconsistencies between Node.js and Firebug which I would like to understand.
Firebug:
Node.js:
Using Object. Object. keys will return an Array, which contains the property names of the object. If the length of the array is 0 , then we know that the object is empty.
There are only seven values that are falsy in JavaScript, and empty objects are not one of them. An empty object is an object that has no properties of its own. You can use the Object.
Checking empty object with JavaScriptIt returns true for objects. And we're covered for null and undefined . It will return false and not throw a TypeError .
The answer is NO, because an array in JavaScript is an instance of the Array object and typeof would return the type object for it.
Let's look at the language grammar, shall we? Section 12, Statements:
Statement : Block VariableStatement EmptyStatement ExpressionStatement ...lots of other stuff...
That's a very fancy way of saying that a statement can be a block, a variable statement, an empty statement, an expression statement, or lots of other stuff. Notice that the first option there is a 'Block':
Block : { StatementList(opt) } StatementList : Statement StatementList Statement
Which is again, a fancy way of saying that a block is a {
, optionally followed by a bunch of statements, followed by a }
.
And that's what you see in your example: Before the JavaScript parser thinks that what you have could be an object literal (which is defined somewhere under ExpressionStatement
, the 4th thing a 'Statement' could be), it first thinks that you have a 'Block'.
Edit: If you want, you can see it live in a JavaScript engine's source code:
Parser::ParseStatement
. The first thing it checks is whether we're on a {
, and if it does, parses as block.Parser::statement
to again see the first check being against a {
and parsing it as a block statement.Regarding your second question, that's been covered to great detail on this question. To summarise in a sentence: Node.js treats your input as if it were an expression (thus it can't be a 'Block'), while Firebug/Chrome dev tools treat it like a 'Statement'.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With