详解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 相关文章推荐
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
Oct 24 Javascript
JavaScript几种形式的树结构菜单
May 10 Javascript
JavaScript取得鼠标绝对位置程序代码介绍
Sep 16 Javascript
使用focus方法让光标默认停留在INPUT框
Jul 29 Javascript
js实现下拉框选择要显示图片的方法
Feb 16 Javascript
node.js操作mongodb学习小结
Apr 25 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
Dec 13 Javascript
vue组件 $children,$refs,$parent的使用详解
Jul 31 Javascript
JavaScript面试出现频繁的一些易错点整理
Mar 29 Javascript
详解Vue中使用Echarts的两种方式
Jul 03 Javascript
Vuex的初探与实战小结
Nov 26 Javascript
在vue中axios设置timeout超时的操作
Sep 04 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
PHP学习之PHP变量
2006/10/09 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
浅谈PHP5.6 与 PHP7.0 区别
2019/10/09 PHP
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
Javascript函数中的arguments.callee用法实例分析
2016/09/16 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
探索Vue高阶组件的使用
2018/01/08 Javascript
vue项目实现github在线预览功能
2018/06/20 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
python3设计模式之简单工厂模式
2017/10/17 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
Python 循环语句之 while,for语句详解
2018/04/23 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
python实现随机漫步方法和原理
2019/06/10 Python
python 爬取马蜂窝景点翻页文字评论的实现
2020/01/20 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
Python flask路由间传递变量实例详解
2020/06/03 Python
Python内置函数property()如何使用
2020/09/01 Python
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
实习老师个人总结的自我评价
2013/09/28 职场文书
采购员岗位职责
2013/11/15 职场文书
12月小学生校园广播稿
2014/02/04 职场文书
会走路的树教学反思
2014/02/20 职场文书
党员公开承诺书范文
2014/03/25 职场文书
《春到梅花山》教学反思
2014/04/16 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
2014年妇联工作总结
2014/11/21 职场文书
Linux安装Docker详细教程
2022/07/07 Servers