◆ REPL の {} はオブジェクト扱いしてくれる
◆ 複文ぽかったら複文扱い 

> {a: 1}
< Object { a: 1 }

あれ?

昔はこれで 1 が返ってきていたはずです

この記事を書いた時はまだ 1 になっていたので この一年で変わったみたいです


1 になるのは 「{}」 が複文 (if とかに使う複数の文をまとめるやつ) と扱われて 「a:」 がラベル扱いで 1 だけ評価されるからです
構文的にはそうかもしれないのですけど そういう意図で書くことはそうそうありません

基本はオブジェクトを書きたいです


よくあるのは JSON をフォーマットしたいとき
コンソールにそのまま貼り付ければ行けそうですが これまでは複文になるのでパースエラーでした

JSON としてパースするためには式として扱わせればよいのでこういうことをしていました
obj = {"value": 100, ............}
({"value": 100, .........})

けっこう忘れますしめんどくさいんです


それがいまでは貼り付けるだけ
良い変更ですね!


ところで オブジェクト扱いならこれまで通りに複文にしたいときはどうすればいいの? とも思います
とくに最近は const/let でブロックスコープが作れるのでこれまではめったに見なかった複文がけっこうみるようになっています

試し見たところ オブジェクトとしてパースできないものが来ると複文で パースできると式とみなしてオブジェクトになるみたいです
ただ 実際にエラーが起きたら とやるとパフォーマンスに影響するからかパース可能かのチェックは実行してみるのではなく独自の処理があるようです
それで ES6 の let/const に対応してないようで if や var がくれば複文として扱われるところが let や const が来ても式として扱われるのでエラーが起きています
{
   a:
   var val = 1
}
// undefined (block)
{
  a:
  val = 1
}
// {a: 1} (expression)
{
   a:
   let val = 1
}
// Uncaught SyntaxError: Unexpected identifier (expression)
{
   a:
   const val = 1
}
// Uncaught SyntaxError: Unexpected token const (expression)
{
    a:
    if(1){}
}
// undefined (block)
{
    a:
    val = 1; val2 = 2
}
// 2 (block)


一部動かないのがありますけど基本はなって欲しいほうにいい感じに切り替えてくれるということですね



(追記:補足)

ところで いつものことですがブラウザ名が書いてないのは基本 Chrome の話です
Firefox や Edge では複文として扱われますので注意してください