• PoolloverNathan@programming.dev
    link
    fedilink
    arrow-up
    44
    ·
    edit-2
    4 months ago

    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:

    • Victor@lemmy.world
      link
      fedilink
      arrow-up
      21
      ·
      4 months ago

      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]'
      
      • PoolloverNathan@programming.dev
        link
        fedilink
        arrow-up
        10
        ·
        4 months ago

        Yep, parentheses force {} to be interpreted as an expression rather than a block — same reason why IIFEs have !function instead of just function.

        • Victor@lemmy.world
          link
          fedilink
          arrow-up
          1
          ·
          edit-2
          4 months ago

          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.