Warning: Some posts on this platform may contain adult material intended for mature audiences only. Viewer discretion is advised. By clicking ‘Continue’, you confirm that you are 18 years or older and consent to viewing explicit content.
The inspector REPL evaluates as a statement-with-value (like eval), so the {} at the beginning is considered an empty block, not an object. This leaves +[], which is 0. I don’t know what would make Node differ, however.
Edit: Tested it myself. It seems Node prefers evaluating this as an expression when it can, but explicitly using eval gives the inspector behavior:
I thought IIFE’s usually looked like (function (...params) {})(...args). That’s not the latest way? To be honest I never used them much, at least not after arrow functions arrived.
The inspector REPL evaluates as a statement-with-value (like
eval
), so the{}
at the beginning is considered an empty block, not an object. This leaves+[]
, which is 0. I don’t know what would make Node differ, however.Edit: Tested it myself. It seems Node prefers evaluating this as an expression when it can, but explicitly using![](https://nathanlaptopv.axolotl-snake.ts.net/rhnpp358211dyyhzzyfam5a6yr3k25ik-Screenshot_20240623-132245.png)
eval
gives the inspector behavior:So there’s yet another level of quirkery to this bullshit then, it seems. 😆 Nice digging! 🤝
I also noticed that if you surround the curlies with parentheses, you get the same again:
> eval('{} + []') 0 > eval('({}) + []') '[object Object]'
Yep, parentheses force
{}
to be interpreted as an expression rather than a block — same reason why IIFEs have!function
instead of justfunction
./me goes back to get second folding chair.
I thought IIFE’s usually looked like
(function (...params) {})(...args)
. That’s not the latest way? To be honest I never used them much, at least not after arrow functions arrived.