js对象为什么不能直接操作？
发现一个小问题，在控制台输入{a:1}.toString()会报错，必须要先把{a:1}赋值给一个变量然后在进行操作才行，这是什么情况
因为语法规定。
因为语法规定导致 js 解释器没有正确理解你的意图。解决办法, 加括号消歧义。
```
({a:1}).toString() // or
({a:1}.toString())
```
## 引申
开始以为是 console 的锅，后来发现 node CLI 里一样存在这个问题，于是发现里蹊跷：
花括号 `{}` 除了可以用来定义对象字面量，还可以用来定义代码块。
冒号`:` 除了可以用来定义对象字面量中的 key-value 对外，还可以用来定义 `label`
label的概念
如果你听说过 C 语言（js就是C系的语法），你听说过有个语句叫 `goto`，那你应该对 `label` 有印象。js 里没有 `goto`，但是有 `break` 和 `continue`, 这俩货可以和 `label` 连用。
`{a:1}.toString()` 之所以报错 `unexpected token .` ，是因为它被解析成了：
```
{
// code block
a: // 定义一个label，名字叫a

1 // 这是一条语句，就一个数值 1
 
}
// block 结束了
.toString() // 报错，非法字符`.`
```
所以你可以这样玩：
```
{
  a:console.log(1);console.log(2);
}
```
这代码语法正确，能执行！