詳解JavaScript語法對{}處理的坑爹之處
JavaScript的語法有多坑,算是眾人皆知了。
先來上張圖

代碼如下:
{} + []; // 0
[] + {}; // "[object Object]"
{} + [] == [] + {}; // false
({} + [] == [] + {}); // true
這么蛋疼的語法坑估計也只有 JavaScript 這樣的奇葩才有。
相信對于絕大部分不研究 JavaScript 編譯器的童鞋,根本無法理解。(至少我也是覺得不可思議)
后來專門去度娘了一下,才有點恍然大悟!
下面,我們先看看這個代碼:
{
a: 1
}
相信大部分童鞋,第一眼都會認為這是一個 對象直接量 。
那這個代碼呢?
{
var a = 1;
}
瀏覽器會提示語法錯誤嗎?
顯然不會!細想一下,我們就會明白到,這是一個 語句塊 。
if (isNumber) {
var a = 1;
}
說到這里,敏銳的你可能已經(jīng)發(fā)現(xiàn):JavaScript 中以 { 開頭,會存在二義性。
那 JavaScript 的編譯器是怎么處理這個二義性的?
了解決這個問題,ECMA 的方法十分簡單粗暴:在語法解析的時候,如果一個語句以「{」開頭,就只把它解釋成語句塊。
這真心是一個坑爹的處理方式!
那既然都是語句塊,那為什么 {a:1} 卻沒有語法錯誤?
其實在這里,a 被解析器理解為了 標簽。標簽 是用來配合 break 和 continue 語句作定向跳轉的。
因此,這樣的寫法就會拋出異常:
{
a: function () {}
}
因為 function () {} 不是函數(shù)聲明,也不是函數(shù)表達式。
到這里,大家應該對 {} 的奇葩處理有了基本的概念。我們再看回文章開始所提到的幾條語句:
{} + []; // 0
[] + {}; // "[object Object]"
{} + [] == [] + {}; // false
({} + [] == [] + {}); // true
第一條,因為 {} 是 語句塊,代碼可以理解為:
if (1) {}
+[]
所以返回值是 0 。
第二條,由于 {} 并不在語句的開頭,所以是一個正常的 對象直接量,空數(shù)組和空對象直接相加,返回 "[object Object]" 。
理解了第一第二條,第三條已經(jīng)無需解釋了。
第四條,因為是 () 開始,第一個 {} 被解析為 對象直接量 ,因而兩條公式相等,返回 true。
相關文章
javaScript array(數(shù)組)使用字符串作為數(shù)組下標的方法
這篇文章主要介紹了javaScript array(數(shù)組)使用字符串作為數(shù)組下標的方法,大家可以測試一下看看2013-11-11
有關JavaScript中call()和apply() 的一些理解
下面小編就為大家?guī)硪黄嘘PJavaScript中call()和apply() 的一些理解。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-05
JavaScript操作HTML DOM節(jié)點的基礎教程
這篇文章主要介紹了JavaScript操作HTML DOM節(jié)點的基礎入門教程,包括對節(jié)點的創(chuàng)建修改刪除等操作,還特別提到了其中appendChild()與insertBefore()插入節(jié)點時需注意的問題,需要的朋友可以參考下2016-03-03
分享javascript實現(xiàn)的冒泡排序代碼并優(yōu)化
本文給大家匯總介紹了幾個個人收藏的JavaScript實現(xiàn)冒泡排序的代碼,都是非常的不錯,有需要的小伙伴可以參考下2016-06-06

