In the REPL, on 12+
version, I am seeing the below.
> {} + []
'[object Object]'
^ This should be 0
This also manifests when you do console.log({} + [])
which prints '[object Object]'
instead of 0
, in many many node versions.
The direct repl behavior seems limited to 12+.
I've been informed that in fact this is correct; {} + []
in a statement context is "a block" and then +[]
, which is 0
, but in an expression context (or as ({}) + []
is '[object Object]'
.
Also:
> [{}+{}, {}+[]]
[ '[object Object][object Object]', '[object Object]' ]
This is not a bug. String({})
is '[object Object]'
and String([])
is ''
.
Nods, [{} + []]
will be '[object Object]'
but {} + []
in REPL should be 0
?
REPL is an expression context, the input is actually ({} + [])
.
We handle REPL input as expression context as @devsnek pointed out. See https://github.com/nodejs/node/blob/651088c3e6b6399a3e656e397c3845b970ad7903/lib/repl.js#L355-L358
This also applies to e.g., { b: 1 }.b
.
As @ljharb highlighted, on node <v12
{} + []
evaluates to 0
on the REPL
[devtools might a different story]
As @devsnek and @BridgeAR pointed out, this is not a bug, but intentional – the REPL prefers to evaluate as expressions before evaluating as statements. So the current one is the expected behavior, and the pre-v12.x one is considered the buggy one.
I’ll close this as I don’t think there’s anything we can do here.
hmm - i don't see this REPL change listed in the blog post: https://nodejs.org/en/blog/release/v12.0.0/
Clearly it's the right fix to make, and I assume its omission is an oversight - could someone link me to the PR that changed it?
Most helpful comment
REPL is an expression context, the input is actually
({} + [])
.