首页 > 开发 > JS > 正文

js对象为什么不能直接操作?

2017-09-05 05:51:25  来源:网友分享

发现一个小问题,在控制台输入{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,但是有 breakcontinue, 这俩货可以和 label 连用。

{a:1}.toString() 之所以报错 unexpected token . ,是因为它被解析成了:

{// code blocka: // 定义一个label,名字叫a1 // 这是一条语句,就一个数值 1 }// block 结束了.toString() // 报错,非法字符`.`

所以你可以这样玩:

{  a:console.log(1);console.log(2);}

这代码语法正确,能执行!