详解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小括号“()”的多义性
Dec 03 Javascript
为指定的元素添加遮罩层的示例代码
Jan 15 Javascript
使用typeof判断function是否存在于上下文
Aug 14 Javascript
将数字转换成大写的人民币表达式的js函数
Sep 21 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
Nov 24 Javascript
javascript从作用域链谈闭包
Jul 29 Javascript
javascript正则表达式模糊匹配IP地址功能示例
Jan 06 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
Feb 10 Javascript
karma+webpack搭建vue单元测试环境的方法示例
May 24 Javascript
微信小程序 数据缓存实现方法详解
Aug 26 Javascript
ES6 async、await的基本使用方法示例
Jun 06 Javascript
vue 使用post/get 下载导出文件操作
Aug 07 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
php4的session功能评述(一)
2006/10/09 PHP
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
javascript getElementsByTagName
2011/01/31 Javascript
javascript克隆对象深度介绍
2012/11/20 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
2016/07/18 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
Angularjs自定义指令实现分页插件(DEMO)
2017/09/16 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
[06:36]吞吞映像top1
2014/06/20 DOTA
详解MySQL数据类型int(M)中M的含义
2016/11/20 Python
python 函数内部修改外部变量的方法
2018/12/18 Python
浅析python的Lambda表达式
2019/02/27 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
2019/07/31 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
Python操作Jira库常用方法解析
2020/04/10 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
周年庆典主持词
2014/04/02 职场文书
公司向个人借款协议书范本
2014/10/09 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书