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

为啥{}.toString()会报错

为啥{}.toString()会报错

慕斯王 2019-03-13 17:13:03
{}.toString()//会报错({}).toString()//不报错[].toString()//不报错var a= {}; a.toString()//不报错求解?大家回答都是对的,感谢!
查看完整描述

4 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

js 引擎在执行时,遇到 {,至少有两种选择,


当做语句块的开始

当做对象字面量表达式的开始

但是,默认情况下,是当做语句块的,所以


{}.toString()

会报错:Unexpected token .


因为实际上浏览器执行的可能是这样:


{}//空语句块

.toString()//另外一条错误的语句

如果要让 js 引擎认为 { 是一个对象字面量表达式的开始,一般就是加 (),这个时候,js 引擎就知道()里的是表达式,所以当做表达式来解析,所以


({}).toString()

就不会报错;


[].toString()

这个不报错,很正常,因为这里没有歧义,肯定是数组字面量表达式


var a= {}; a.toString()//不报错

这个不报错,更正常了,没有歧义,分号表示有两条语句,虽然放在同一行,不影响,因为有分号;


我来给你看看书上是怎么说的:

https://img1.sycdn.imooc.com//5c8f49e00001df1308000231.jpg

不过具体解析的时候,chrome 还有点特殊的,详情戳这
JavaScript高级程序设计-第3版-中 p84

查看完整回答
2 反对 回复 2019-03-18
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

我猜是{}被当成了代码块吧,自然就没有toString的方法了。


查看完整回答
反对 回复 2019-03-18
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

因为这里 {} 被解析成了一个空的block, 不是解析成一个对象
这个和[] + {}{} + [] 结果为什么不一样是一样的道理

查看完整回答
反对 回复 2019-03-18
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

因为{}被解析为代码语句了,所以跟{}不构成关系,而.toString()不是完整的一行代码语句了。

括号里不能包含语句,所以被解释成表达式。

只要能让{}不产生歧义地认为是表达式,就不会报错了,例如:


({}).toString();

({}.toString());

1 * {}.toString();

+{}.toString();

~{}.toString();

-{}.toString();

1 / {}.toString();

这也是立即执行函数为什么不报错的原因。


function(){}(); // function(){}被解析为语句,()内不能为空,所以报错

(function() {})(); // 通常写法,可读性好。后面两行写法不推荐

(function() {}());

+function() {}();

new function() {}();


查看完整回答
反对 回复 2019-03-18
  • 4 回答
  • 0 关注
  • 1988 浏览
慕课专栏
更多

添加回答

举报

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