最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解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;
}


說到這里,敏銳的你可能已經(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。

相關文章

最新評論

扎兰屯市| 建昌县| 海原县| 襄汾县| 横峰县| 威海市| 汕头市| 娱乐| 广汉市| 龙口市| 南京市| 台中县| 砚山县| 巩留县| 西和县| 建平县| 汕头市| 磐安县| 铜鼓县| 南木林县| 施甸县| 白山市| 文安县| 顺平县| 通化县| 肇源县| 将乐县| 丽江市| 扶风县| 瑞昌市| 洪湖市| 富蕴县| 革吉县| 罗定市| 清流县| 兴海县| 沙雅县| 小金县| 大安市| 镇坪县| 繁昌县|