手机版

详细解释JavaScript语法在处理{}时的陷阱

时间:2021-11-07 来源:互联网 编辑:宝哥软件园 浏览:

众所周知,JavaScript语法有缺陷。先拍张照片

代码如下:复制代码如下: { }[];//0[] {};//'[Object Object]' { }[]==[]{ };//false({ }[]==[]{ });//没错,估计这样痛苦的语法坑只能在JavaScript中找到。我相信大部分不学习JavaScript编译器的童鞋根本无法理解。(至少我也觉得不可思议。)后来我特意去找杜娘,才恍然大悟!现在先来看看这个代码:复制代码如下:{ a: 1}相信大部分童鞋第一眼看到都会被当成实物直量。这个代码呢?复制的代码如下: { var a=1;}浏览器会提示语法错误吗?显然不是!仔细考虑后,我们会明白这是一个语句块。复制代码如下: if(is number){ var a=1;}说到这里,您可能已经发现了JavaScript以{ }开头时存在歧义。JavaScript编译器是如何处理这种歧义的?要解决这个问题,ECMA非常简单粗暴:解析时,如果一条语句以“{”开头,只会被解释为语句块。这真是一个糟糕的处理方式!既然都是语句块,{a:1}为什么没有语法错误?事实上,在这里,解析器将a理解为一个标签。标签用于使用break和continue语句进行方向跳转。因此,这种写法会抛出一个异常:复制代码如下:{ a: function () {}}因为function () {}既不是函数声明,也不是函数表达式。至此,大家应该对{}的奇葩有了一个基本的概念。让我们回顾一下文章开头提到的几个语句:复制代码如下: { }[];//0[] {};//'[Object Object]' { }[]==[]{ };//false({ }[]==[]{ });//true第一个,因为{}是语句块,代码可以理解为:复制的代码如下:if (1) {} [],所以返回值为0。二是因为{}不在语句开头,是正常的对象直接量,空数组和空对象直接相加返回“[Object]”。理解了第一条和第二条,就没有必要解释第三条了。第四,因为以()开头,第一个{}解析为对象的直接量,所以两个公式相等,返回true。

版权声明:详细解释JavaScript语法在处理{}时的陷阱是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。