详解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 相关文章推荐
javascript cookie解码函数(兼容ff)
Mar 17 Javascript
Javascript 通过json自动生成Dom的代码
Apr 01 Javascript
基于JQuery实现的类似购物商城的购物车
Dec 06 Javascript
JavaScript 盒模型 尺寸深入理解
Dec 31 Javascript
再谈Javascript中的异步以及如何异步
Aug 19 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
Oct 05 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
Oct 24 Javascript
javascript九宫格图片随机打乱位置的实现方法
Mar 15 Javascript
ajax请求+vue.js渲染+页面加载的示例
Feb 11 Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
Jan 29 Javascript
iview form清除校验状态的实现
Sep 19 Javascript
echarts实现晶体球面投影的实例教程
Oct 10 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动态创建Flash动画
2006/10/09 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
2014/06/09 PHP
php文件夹的创建与删除方法
2015/01/24 PHP
PHP实现关键字搜索后描红功能示例
2019/07/03 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
extjs DataReader、JsonReader、XmlReader的构造方法
2009/11/07 Javascript
jquery里的正则表达式说明
2011/08/03 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
JavaScript函数作用域链分析
2015/02/13 Javascript
用window.onerror捕获并上报Js错误的方法
2016/01/27 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
2016/02/28 Javascript
手机Web APP如何实现分享多平台功能
2016/08/19 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
Vue DevTools调试工具的使用
2017/12/05 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
python3写的简单本地文件上传服务器实例
2018/06/04 Python
解决python3 requests headers参数不能有中文的问题
2019/08/21 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
如何通过python实现人脸识别验证
2020/01/17 Python
Python 解析xml文件的示例
2020/09/29 Python
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
西安当代医院管理研究院笔试题
2015/12/11 面试题
小学三好学生事迹材料
2014/08/15 职场文书
2014年干部作风建设总结
2014/10/23 职场文书
2014村党支部书记党建工作汇报材料
2014/11/02 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
PHP控制循环操作的时间
2021/04/01 PHP
Python基于百度API识别并提取图片中文字
2021/06/27 Python
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL