详解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 相关文章推荐
WordPress 照片lightbox效果的运用几点
Jun 22 Javascript
JavaScript setTimeout和setInterval的使用方法 说明
Mar 25 Javascript
异步动态加载js与css文件的js代码
Sep 15 Javascript
7个JS基础知识总结
Mar 05 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
Jun 24 Javascript
JavaScript中获取高度和宽度函数总结
Oct 08 Javascript
浅谈jQuery hover(over, out)事件函数
Dec 03 Javascript
jquery插件bootstrapValidator表单验证详解
Dec 15 Javascript
Bootstrap和Java分页实例第一篇
Dec 23 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
May 03 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
Aug 04 Javascript
Angular开发实践之服务端渲染
Mar 29 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
回首过去10年中最搞笑的10部动漫,哪一部让你节操尽碎?
2020/03/03 日漫
smarty section简介与用法分析
2008/10/03 PHP
PHP基础知识回顾
2012/08/16 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
php输出xml必须header的解决方法
2014/10/17 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
thinkphp获取栏目和文章当前位置的方法
2014/10/29 PHP
php use和include区别总结
2019/10/13 PHP
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
JS定时器实例详细分析
2013/10/11 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
轻松实现JavaScript图片切换
2016/01/12 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
python批量赋值操作实例
2018/10/22 Python
linux安装python修改默认python版本方法
2019/03/31 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
实习期自我鉴定
2013/10/11 职场文书
天鹅的故事教学反思
2014/02/04 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
土建施工员岗位职责
2014/07/16 职场文书
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
采购员工作总结范文
2015/08/12 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
React列表栏及购物车组件使用详解
2021/06/28 Javascript
Python中异常处理用法
2021/11/27 Python
vue递归实现树形组件
2022/07/15 Vue.js