为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只甜甜圈 2018-12-21 19:14:25
发现一个小问题,在控制台输入{a:1}.toString()会报错,必须要先把{a:1}赋值给一个变量然后在进行操作才行,这是什么情况
查看完整描述

1 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

因为语法规定。


因为语法规定导致 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);

}

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


查看完整回答
反对 回复 2019-01-21
  • 1 回答
  • 0 关注
  • 456 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信