发现一个小问题,在控制台输入{a:1}.toString()会报错,必须要先把{a:1}赋值给一个变量然后在进行操作才行,这是什么情况
1 回答
守着星空守着你
TA贡献1799条经验 获得超8个赞
因为语法规定。
因为语法规定导致 js 解释器没有正确理解你的意图。解决办法, 加括号消歧义。
({a:1}).toString() // or
({a:1}.toString())
引申
开始以为是 console 的锅,后来发现 node CLI 里一样存在这个问题,于是发现里蹊跷:
花括号 {} 除了可以用来定义对象字面量,还可以用来定义代码块。
冒号: 除了可以用来定义对象字面量中的 key-value 对外,还可以用来定义 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);
}
这代码语法正确,能执行!
添加回答
举报
0/150
提交
取消