详解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 相关文章推荐
js下写一个事件队列操作函数
Jul 19 Javascript
jscript读写二进制文件的方法
Apr 22 Javascript
JS实现随机乱撞彩色圆球特效的方法
May 05 Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 Javascript
js拼接html字符串的注意事项
Oct 13 Javascript
Bootstrap的modal拖动效果
Dec 25 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
Jun 08 Javascript
vue 引入公共css文件的简单方法(推荐)
Jan 20 Javascript
Vue2.0子同级组件之间数据交互方法
Feb 28 Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
Jul 10 Javascript
Vue 动态添加路由及生成菜单的方法示例
Jun 20 Javascript
react 不用插件实现数字滚动的效果示例
Apr 14 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基础知识:类与对象(3) 构造函数和析构函数
2006/12/13 PHP
PHP 类相关函数的使用详解
2013/05/10 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
脚本收藏iframe
2006/07/21 Javascript
javascript 处理HTML元素必须避免使用的一种方法
2009/07/30 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
jquery zTree异步加载简单实例讲解
2016/02/25 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
2016/11/24 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
Angular 4.x 路由快速入门学习
2017/05/03 Javascript
Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例
2017/09/30 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
使用PDB模式调试Python程序介绍
2015/04/05 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
2020/06/22 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
捷克玩具商店:Bambule
2019/02/23 全球购物
黄河的主人教学反思
2014/02/07 职场文书
个人安全承诺书
2014/05/22 职场文书
个人存款证明书
2014/10/18 职场文书
12.4全国法制宣传日活动方案
2014/11/02 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
2014年安全员工作总结
2014/11/13 职场文书
运动会表扬稿
2015/01/16 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
大学军训口号大全
2015/12/24 职场文书
安全教育培训心得体会
2016/01/15 职场文书
javascript canvas实现雨滴效果
2021/06/09 Javascript
Javascript设计模式之原型模式详细
2021/10/05 Javascript
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL