详解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 写的一个简单的timer
Jul 30 Javascript
jquery随机展示头像代码
Dec 21 Javascript
jsp+javascript打造级连菜单的实例代码
Jun 14 Javascript
JS嵌套函数调用上下文的问题解决
Mar 26 Javascript
Javascript判断图片尺寸大小实例分析
Jun 16 Javascript
jquery单行文字向上滚动效果的实现代码
Sep 05 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
Jun 06 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
Jun 08 Javascript
jquery实现垂直和水平菜单导航栏
Aug 27 Javascript
详解vuex结合localstorage动态监听storage的变化
May 03 Javascript
Node.js+Express+Mysql 实现增删改查
Apr 03 Javascript
详解vue beforeEach 死循环问题解决方法
Feb 25 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
火影忍者:三大瞳力之一的白眼,为什么没有写轮眼那么出色?
2020/03/02 日漫
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
基于python发送邮件的乱码问题的解决办法
2013/04/25 PHP
深入PHP5中的魔术方法详解
2013/06/17 PHP
PHP闭包实例解析
2014/09/08 PHP
php遍历目录方法小结
2015/03/10 PHP
FastCGI 进程意外退出造成500错误
2015/07/26 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
ThinkPHP的常用配置选项汇总
2016/03/24 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
jQuery+css+html实现页面遮罩弹出框
2013/03/21 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
JavaScript中伪协议 javascript:使用探讨
2014/07/18 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
获取阴历(农历)和当前日期的js代码
2016/02/15 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
2016/10/10 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
解决bootstrap下拉菜单点击立即隐藏bug的方法
2017/06/13 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
[01:14:41]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第一场 1月8日
2021/03/11 DOTA
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
python如何在终端里面显示一张图片
2016/08/17 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
python add_argument()用法解析
2020/01/29 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
python实现udp聊天窗口
2020/03/31 Python
python实现人脸签到系统
2020/04/13 Python
Python同时处理多个异常的方法
2020/07/28 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
兼职学生的自我评价
2013/11/24 职场文书