詳解JavaScript語(yǔ)法對(duì){}處理的坑爹之處
JavaScript的語(yǔ)法有多坑,算是眾人皆知了。
先來(lái)上張圖
代碼如下:
{} + []; // 0
[] + {}; // "[object Object]"
{} + [] == [] + {}; // false
({} + [] == [] + {}); // true
這么蛋疼的語(yǔ)法坑估計(jì)也只有 JavaScript 這樣的奇葩才有。
相信對(duì)于絕大部分不研究 JavaScript 編譯器的童鞋,根本無(wú)法理解。(至少我也是覺(jué)得不可思議)
后來(lái)專門去度娘了一下,才有點(diǎn)恍然大悟!
下面,我們先看看這個(gè)代碼:
{
a: 1
}
相信大部分童鞋,第一眼都會(huì)認(rèn)為這是一個(gè) 對(duì)象直接量 。
那這個(gè)代碼呢?
{
var a = 1;
}
瀏覽器會(huì)提示語(yǔ)法錯(cuò)誤嗎?
顯然不會(huì)!細(xì)想一下,我們就會(huì)明白到,這是一個(gè) 語(yǔ)句塊 。
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)的。
因此,這樣的寫法就會(huì)拋出異常:
{
a: function () {}
}
因?yàn)?function () {} 不是函數(shù)聲明,也不是函數(shù)表達(dá)式。
到這里,大家應(yīng)該對(duì) {} 的奇葩處理有了基本的概念。我們?cè)倏椿匚恼麻_(kāi)始所提到的幾條語(yǔ)句:
{} + []; // 0
[] + {}; // "[object Object]"
{} + [] == [] + {}; // false
({} + [] == [] + {}); // true
第一條,因?yàn)?{} 是 語(yǔ)句塊,代碼可以理解為:
if (1) {}
+[]
所以返回值是 0 。
第二條,由于 {} 并不在語(yǔ)句的開(kāi)頭,所以是一個(gè)正常的 對(duì)象直接量,空數(shù)組和空對(duì)象直接相加,返回 "[object Object]" 。
理解了第一第二條,第三條已經(jīng)無(wú)需解釋了。
第四條,因?yàn)槭?() 開(kāi)始,第一個(gè) {} 被解析為 對(duì)象直接量 ,因而兩條公式相等,返回 true。
- javascript之函數(shù)直接量(function(){})()
- js函數(shù)使用技巧之 setTimeout(function(){},0)
- JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
- js 中{},[]中括號(hào),大括號(hào)使用詳解
- js面向?qū)ο笤O(shè)計(jì)用{}好還是function(){}好(構(gòu)造函數(shù))
- 解決css和js的{}與smarty定界符沖突問(wèn)題的兩種方法
- 解析Javascript中大括號(hào)“{}”的多義性
- javascript的 {} 語(yǔ)句塊詳解
相關(guān)文章
Javascript 復(fù)制數(shù)組實(shí)現(xiàn)代碼
Javascript 復(fù)制數(shù)組實(shí)現(xiàn)代碼,需要的朋友可以參考下。2009-11-11深入探討JavaScript的最基本部分之執(zhí)行上下文
今天小編就為大家分享一篇關(guān)于深入探討JavaScript的最基本部分之執(zhí)行上下文,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02優(yōu)化RequireJS項(xiàng)目的相關(guān)技巧總結(jié)
這篇文章主要介紹了優(yōu)化RequireJS項(xiàng)目的相關(guān)技巧總結(jié),RequireJS是一個(gè)人氣JavaScript庫(kù),需要的朋友可以參考下2015-07-07JavaScript學(xué)習(xí)筆記之JS對(duì)象
這篇文章向我們?cè)敿?xì)介紹了javascript中的對(duì)象,包括默認(rèn)對(duì)象、數(shù)組對(duì)象、字符串對(duì)象、自定義對(duì)象,并通過(guò)示例對(duì)這4中對(duì)象做了對(duì)比分析,推薦給大家。2015-01-01Javascript Boolean、Nnumber、String 強(qiáng)制類型轉(zhuǎn)換的區(qū)別詳細(xì)介紹
我們知道 Boolean(value) 是把值轉(zhuǎn)換成Boolean類型,Nnumber(value) 是把值轉(zhuǎn)換成數(shù)字(整型或浮點(diǎn)數(shù)),而 String(value) 是把值轉(zhuǎn)換成字符串,需要的朋友可以了解下2012-12-12簡(jiǎn)介JavaScript中toTimeString()方法的使用
這篇文章主要介紹了簡(jiǎn)介JavaScript中toTimeString()方法的使用,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06