详解JavaScript语法对{}处理的坑爹之处

 更新时间:2014年06月05日 10:19:05   作者:  
这篇文章主要介绍了详解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 复制数组实现代码

    Javascript 复制数组实现代码,需要的朋友可以参考下。
    2009-11-11
  • 深入探讨JavaScript的最基本部分之执行上下文

    深入探讨JavaScript的最基本部分之执行上下文

    今天小编就为大家分享一篇关于深入探讨JavaScript的最基本部分之执行上下文,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 优化RequireJS项目的相关技巧总结

    优化RequireJS项目的相关技巧总结

    这篇文章主要介绍了优化RequireJS项目的相关技巧总结,RequireJS是一个人气JavaScript库,需要的朋友可以参考下
    2015-07-07
  • javascript知识点详解

    javascript知识点详解

    下面小编就为大家带来一篇JavaScript基础知识点归纳(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-09-09
  • JavaScript数据类型详解

    JavaScript数据类型详解

    这篇文章主要介绍了JavaScript数据类型详解,本文详细讲解了JavaScript中有5种基本数据类型:Undefined、Null、Boolean、Number和String,需要的朋友可以参考下
    2015-04-04
  • JavaScript学习笔记之JS对象

    JavaScript学习笔记之JS对象

    这篇文章向我们详细介绍了javascript中的对象,包括默认对象、数组对象、字符串对象、自定义对象,并通过示例对这4中对象做了对比分析,推荐给大家。
    2015-01-01
  • 获取body标签的两种方法

    获取body标签的两种方法

    获取body标签的两种方法,有时候需要动态的在body中添加内容用得到。
    2011-10-10
  • Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍

    Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍

    我们知道 Boolean(value) 是把值转换成Boolean类型,Nnumber(value) 是把值转换成数字(整型或浮点数),而 String(value) 是把值转换成字符串,需要的朋友可以了解下
    2012-12-12
  • js中运算符&& 和 || 的使用记录

    js中运算符&& 和 || 的使用记录

    js中&& 和 ||运算符经常用到,但也好混淆,下面是对自己的使用坐下记录,需要的朋友可以参考下
    2014-08-08
  • 简介JavaScript中toTimeString()方法的使用

    简介JavaScript中toTimeString()方法的使用

    这篇文章主要介绍了简介JavaScript中toTimeString()方法的使用,是JS入门学习中的基础知识,需要的朋友可以参考下
    2015-06-06

最新评论