详解JavaScript语法对{}处理的坑爹之处


Posted in Javascript onJune 05, 2014

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。

Javascript 相关文章推荐
犀利的js 函数集合
Jun 11 Javascript
Extjs ajax同步请求时post方式参数发送方式
Aug 05 Javascript
extJs 常用到的增,删,改,查操作代码
Dec 28 Javascript
学习并汇集javascript匿名函数
Nov 25 Javascript
Node.js实现批量去除BOM文件头
Dec 20 Javascript
Jquery 实现图片轮换
Jan 28 Javascript
JavaScript每天必学之基础知识
Sep 17 Javascript
AngularJS 防止页面闪烁的方法
Mar 09 Javascript
Vue+axios 实现http拦截及路由拦截实例
Apr 25 Javascript
JS运动特效之同时运动实现方法分析
Jan 24 Javascript
vue 中swiper的使用教程
May 22 Javascript
微信小程序select下拉框实现源码
Nov 08 Javascript
封装了一个支持匿名函数的Javascript事件监听器
Jun 05 #Javascript
用js读、写、删除Cookie代码分享及详细注释说明
Jun 05 #Javascript
NODE.JS加密模块CRYPTO常用方法介绍
Jun 05 #Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
Jun 05 #Javascript
在Node.js中实现文件复制的方法和实例
Jun 05 #Javascript
javascript移动设备Web开发中对touch事件的封装实例
Jun 05 #Javascript
删除条目时弹出的确认对话框
Jun 05 #Javascript
You might like
php添加数据到xml文件的简单例子
2016/09/08 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
2017/06/17 PHP
使用正则替换变量
2007/05/05 Javascript
js apply/call/caller/callee/bind使用方法与区别分析
2009/10/28 Javascript
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
JavaScript实现的购物车效果可以运用在好多地方
2014/05/09 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
通过js控制时间,一秒一秒自己动的实例
2017/10/25 Javascript
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
刷新页面后让控制台的js代码继续执行
2019/09/20 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
python素数筛选法浅析
2018/03/19 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
2019/04/15 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
python使用matplotlib绘制折线图的示例代码
2020/09/22 Python
个人简历自荐信
2013/12/05 职场文书
实习单位接收函
2014/01/11 职场文书
绩效工资分配方案
2014/01/18 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
单位绩效考核方案
2014/05/11 职场文书
同学聚会策划方案
2014/06/06 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
学生上课看漫画的检讨书
2014/09/26 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
大学学习委员竞选稿
2015/11/20 职场文书