国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

詳解JavaScript語(yǔ)法對(duì){}處理的坑爹之處

2019-11-20 14:54:40
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

JavaScript的語(yǔ)法有多坑,算是眾人皆知了。

先來(lái)上張圖

代碼如下:

復(fù)制代碼 代碼如下:

{} + [];    // 0
[] + {};    // "[object Object]"
{} + [] == [] + {};    // false
({} + [] == [] + {});    // true

這么蛋疼的語(yǔ)法坑估計(jì)也只有 JavaScript 這樣的奇葩才有。

相信對(duì)于絕大部分不研究 JavaScript 編譯器的童鞋,根本無(wú)法理解。(至少我也是覺(jué)得不可思議)

后來(lái)專門去度娘了一下,才有點(diǎn)恍然大悟!

下面,我們先看看這個(gè)代碼:

復(fù)制代碼 代碼如下:

{
    a: 1
}

相信大部分童鞋,第一眼都會(huì)認(rèn)為這是一個(gè) 對(duì)象直接量 。

那這個(gè)代碼呢?

復(fù)制代碼 代碼如下:

{
    var a = 1;
}

瀏覽器會(huì)提示語(yǔ)法錯(cuò)誤嗎?

顯然不會(huì)!細(xì)想一下,我們就會(huì)明白到,這是一個(gè) 語(yǔ)句塊 。

復(fù)制代碼 代碼如下:

if (isNumber) {
    var a = 1;
}


說(shuō)到這里,敏銳的你可能已經(jīng)發(fā)現(xiàn):JavaScript 中以 { 開(kāi)頭,會(huì)存在二義性。

那 JavaScript 的編譯器是怎么處理這個(gè)二義性的?

    了解決這個(gè)問(wèn)題,ECMA 的方法十分簡(jiǎn)單粗暴:在語(yǔ)法解析的時(shí)候,如果一個(gè)語(yǔ)句以「{」開(kāi)頭,就只把它解釋成語(yǔ)句塊。

這真心是一個(gè)坑爹的處理方式!

那既然都是語(yǔ)句塊,那為什么 {a:1} 卻沒(méi)有語(yǔ)法錯(cuò)誤?

其實(shí)在這里,a 被解析器理解為了 標(biāo)簽。標(biāo)簽 是用來(lái)配合 break 和 continue 語(yǔ)句作定向跳轉(zhuǎn)的。

因此,這樣的寫(xiě)法就會(huì)拋出異常:

復(fù)制代碼 代碼如下:

{
    a: function () {}
}

因?yàn)?function () {}  不是函數(shù)聲明,也不是函數(shù)表達(dá)式。

到這里,大家應(yīng)該對(duì) {} 的奇葩處理有了基本的概念。我們?cè)倏椿匚恼麻_(kāi)始所提到的幾條語(yǔ)句:

復(fù)制代碼 代碼如下:

{} + [];    // 0
[] + {};    // "[object Object]"
{} + [] == [] + {};    // false
({} + [] == [] + {});    // true

第一條,因?yàn)?{} 是 語(yǔ)句塊,代碼可以理解為:

復(fù)制代碼 代碼如下:

if (1) {}
+[]

所以返回值是 0 。

第二條,由于 {} 并不在語(yǔ)句的開(kāi)頭,所以是一個(gè)正常的 對(duì)象直接量,空數(shù)組和空對(duì)象直接相加,返回 "[object Object]" 。

理解了第一第二條,第三條已經(jīng)無(wú)需解釋了。

第四條,因?yàn)槭?() 開(kāi)始,第一個(gè) {} 被解析為 對(duì)象直接量 ,因而兩條公式相等,返回 true。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 甘谷县| 昌平区| 长丰县| 衡阳市| 甘谷县| 虎林市| 尼木县| 连平县| 嘉祥县| 孟村| 鄱阳县| 呼图壁县| 洪泽县| 韶关市| 工布江达县| 项城市| 梁山县| 绥中县| 徐汇区| 垣曲县| 清涧县| 舞阳县| 黄石市| 青浦区| 繁昌县| 南平市| 新宾| 四子王旗| 松桃| 浦江县| 桂林市| 库伦旗| 苏州市| 邵阳县| 耒阳市| 潍坊市| 乌拉特中旗| 陕西省| 肇州县| 泗水县| 西吉县|