这篇文章主要介绍了详解JavaScript语法对{}处理的坑爹之处,需要的朋友可以参考下

JavaScript的语法有多坑,算是众人皆知了。

先来上张图

代码如下:


{} + [];  // 0
[] + {};  // "[object Object]"
{} + [] == [] + {};  // false
({} + [] == [] + {});  // true

这么蛋疼的语法坑估计也只有 JavaScript 这样的奇葩才有。

相信对于绝大部分不研究 JavaScript 编译器的童鞋,根本无法理解。(至少我也是觉得不可思议)

后来专门去度娘了一下,才有点恍然大悟!

下面,我们先看看这个代码:


{
  a: 1
}

相信大部分童鞋,第一眼都会认为这是一个 对象直接量 。

那这个代码呢?


{
  var a = 1;
}

浏览器会提示语法错误吗?

显然不会!细想一下,我们就会明白到,这是一个 语句块 。


if (isNumber) {
  var a = 1;
}


说到这里,敏锐的你可能已经发现:JavaScript 中以 { 开头,会存在二义性。

那 JavaScript 的编译器是怎么处理这个二义性的?

  了解决这个问题,ECMA 的方法十分简单粗暴:在语法解析的时候,如果一个语句以「{」开头,就只把它解释成语句块。

这真心是一个坑爹的处理方式!

那既然都是语句块,那为什么 {a:1} 却没有语法错误?

其实在这里,a 被解析器理解为了 标签。标签 是用来配合 break 和 continue 语句作定向跳转的。

因此,这样的写法就会抛出异常:


{
  a: function () {}
}

因为 function () {}  不是函数声明,也不是函数表达式。

到这里,大家应该对 {} 的奇葩处理有了基本的概念。我们再看回文章开始所提到的几条语句:


{} + [];  // 0
[] + {};  // "[object Object]"
{} + [] == [] + {};  // false
({} + [] == [] + {});  // true

第一条,因为 {} 是 语句块,代码可以理解为:


if (1) {}
+[]

所以返回值是 0 。

第二条,由于 {} 并不在语句的开头,所以是一个正常的 对象直接量,空数组和空对象直接相加,返回 "[object Object]" 。

理解了第一第二条,第三条已经无需解释了。

第四条,因为是 () 开始,第一个 {} 被解析为 对象直接量 ,因而两条公式相等,返回 true。

最新资讯
五月天陈奕迅线上演唱会刷屏背后

五月天陈奕迅线上演唱

6点,晨光熹微,香港维多利亚港畔,音乐响起。
恒星赤道低温,行星两个夏季:"最热行星"所在系统,为何如此奇特

恒星赤道低温,行星两

通过勘测卫星对一颗距离地球670光年的系外行星的细致
乘风破浪的B站,何时能占据C位?

乘风破浪的B站,何时能

这半年来,B站乘风破浪,热点不停。7月9日,路透社援引知情
盖茨:新冠治疗药物应提供给需要的人 而非“出价最高者”

盖茨:新冠治疗药物应提

当地时间7月11日,美国盖茨基金会联席主席比尔·盖茨在
特斯拉在美国大幅下调Model Y价格

特斯拉在美国大幅下调

特斯拉美国官网显示,Model Y起售价下调至50000美元下方
特斯拉9月22日将举行“电池日” 马斯克身价超巴菲特

特斯拉9月22日将举行

北京时间7月11日,特斯拉向美国证券交易日委员会(SEC)递交
最新文章
Vue实现图片与文字混输效果

Vue实现图片与文字混

用多了 JQuery ,习惯了使用JQuery的API操作 DOM ,几乎忘
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)

Vue实现点击当前元素

这篇文章主要介绍了Vue实现点击当前元素以外的地方隐
Vue实现验证码功能

Vue实现验证码功能

这篇文章主要为大家详细介绍了Vue实现验证码功能,文中
JS实现的雪花飘落特效示例

JS实现的雪花飘落特效

这篇文章主要介绍了JS实现的雪花飘落特效,结合实例形
微信小程序实现图片压缩

微信小程序实现图片压

这篇文章主要为大家详细介绍了微信小程序实现图片压缩
JavaScript实现京东放大镜效果

JavaScript实现京东放

这篇文章主要为大家详细介绍了JavaScript实现京东放大