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

什么时候JS将{}解释为空块而不是空对象?

/ 猿问

什么时候JS将{}解释为空块而不是空对象?

慕盖茨9453107 2019-08-19 17:36:24

什么时候JS将{}解释为空块而不是空对象?

我正在阅读这个问题的答案(关于“wat”视频),它说:

  1. {}+[]
    这被解释为一个空的代码块,一元加和空数组。第一部分什么都不做,数组转换为逗号分隔的字符串(空数组为空数组),然后转换为数字(空字符串转换为0),因此为0。

我目前正在从“权威指南”学习JS,所以我试着真正理解这样的事情。

我的问题是,JS何时决定将其解释{}为空代码块,而不是空对象?

另外,我想了解Node.js和Firebug之间的一些不一致之处。

萤火虫:

https://img4.mukewang.com/5d5a6dd90001650501370122.png

Node.js的:

https://img1.mukewang.com/5d5a6de000015f4801370075.png


查看完整描述

2 回答

?
胡说叔叔

我们来看看语言语法吧?第12节,声明

Statement :
    Block
    VariableStatement
    EmptyStatement
    ExpressionStatement
    ...lots of other stuff...

这是一种非常奇特的方式,可以说语句可以是块,变量语句,空语句,表达式语句或许多其他东西。请注意,第一个选项是“Block”:

Block :
    { StatementList(opt) }StatementList :
    Statement
    StatementList Statement

再一次,这是一种奇特的方式,说一个块是一个{,可选地后跟一堆语句,然后是一个}

这就是你在你的例子中看到的:在JavaScript解析器认为你拥有的东西可能是一个对象文字(在某个地方被定义ExpressionStatement,第四个是'Statement'可能是)之前,它首先认为你有一个'Block ”。

编辑:如果需要,您可以在JavaScript引擎的源代码中看到它:

关于你的第二个问题,关于这个问题已经详细介绍。总结一句话:Node.js将您的输入视为表达式(因此它不能是“阻止”),而Firebug / Chrome开发工具将其视为“语句”。


查看完整回答
反对 回复 2019-08-19
?
素胚勾勒不出你

当新语句中的第一个标记为{,则将{}其解释为空块。

(实际上当然{出现在类似ifor 之类的header子句之后while,那么它{}也是一个空块,但那不是有趣的情况。)

因此,在任何其他上下文中,比如说一个函数的参数:

foo({});

{}被解释为一个空对象文字。

这种情况类似于function关键字在语句中的第一件事时被区别对待的方式。语法有歧义,解析器用固定规则解决问题。


查看完整回答
反对 回复 2019-08-19

添加回答

回复

举报

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