详解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 相关文章推荐
使用jQuery简化Ajax开发 Ajax开发入门
Oct 14 Javascript
ajax上传时参数提交不更新等相关问题
Dec 11 Javascript
VS2008中使用JavaScript调用WebServices
Dec 18 Javascript
jQuery创建DOM元素实例解析
Jan 19 Javascript
jQuery简单实现遍历数组的方法
Apr 14 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
Nov 29 Javascript
JavaScript中数组的各种操作的总结(必看篇)
Feb 13 Javascript
jquery平滑滚动到顶部插件使用详解
May 08 jQuery
微信小程序实现漂亮的弹窗效果
May 26 Javascript
javascript中关于类型判断的一些疑惑小结
Oct 14 Javascript
初学node.js中实现删除用户路由
May 27 Javascript
深入学习Vue nextTick的用法及原理
Oct 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设计模式 Observer(观察者模式)
2011/06/26 PHP
PHP实现对站点内容外部链接的过滤方法
2014/09/10 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
php实现的操作excel类详解
2016/01/15 PHP
PHP屏蔽关键字实现方法
2016/11/17 PHP
兼容ie和firefox js关闭代码
2008/12/11 Javascript
jQuery实现简单的间隔向上滚动效果
2015/03/09 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
JS实现的简易拖放效果示例
2016/12/29 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
详解Python中的文件操作
2016/08/28 Python
python实现报表自动化详解
2017/11/16 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
2018/06/05 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
Python调用shell命令常用方法(4种)
2020/05/11 Python
python获得命令行输入的参数的两种方式
2020/11/02 Python
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
泰国办公用品购物网站:OfficeMate
2018/02/04 全球购物
物流合作计划书
2014/01/10 职场文书
《动手做做看》教学反思
2014/04/09 职场文书
个人投资计划书
2014/05/01 职场文书
服务承诺书格式
2014/05/21 职场文书
教师竞聘上岗演讲稿
2014/09/03 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
举起手来观后感
2015/06/09 职场文书