走進(jìn)javascript——不起眼的基礎(chǔ),值和分號(hào)
值
有時(shí)我很想知道javascript解析引擎是如何區(qū)分一個(gè)變量的值,比如下面這段代碼。
var x = 'javascript'; //javascript x = "hello"; // hello x = 555; //555 x = null; //null x = a; //a is not defined x = true; //true
對(duì)于數(shù)字是直接賦值的,因?yàn)樗鼪](méi)有多樣性,數(shù)字就是數(shù)字。但是對(duì)于值是英文的情況就很難區(qū)分了,因?yàn)樵诰幊陶Z(yǔ)言中,英文既可能是字符串,也可能是引用的另外一個(gè)變量。因此如何區(qū)分變量和字符串就顯得格外重要,編程語(yǔ)言常常將字符串用引號(hào)括起來(lái),從而達(dá)到區(qū)分變量和字符串的作用。有些語(yǔ)言比如java,它們還區(qū)分單引號(hào)和雙引號(hào),單引號(hào)括起來(lái)的是一個(gè)字符,而雙引號(hào)括起來(lái)的才是字符串。但javascript并不區(qū)分字符和字符串,而是把它們都當(dāng)作字符串,因此在javascript中單引號(hào)和雙引號(hào)并沒(méi)有什么區(qū)別。
雖然通過(guò)引號(hào)可以用來(lái)區(qū)分變量和字符串,但值往往也可能是一個(gè)關(guān)鍵字,比如上面那段代碼我將x賦值為null,那么這些編程語(yǔ)言又是如何區(qū)分變量和關(guān)鍵字的呢?
null = 123; console.log(null); //Uncaught ReferenceError: Invalid left-hand side in assignment undefined = 456; console.log(undefined); //undefined
以上我給null和undefined分別賦給了另外一個(gè)值,其結(jié)果,給null賦值報(bào)錯(cuò)了,給undefined賦值雖然沒(méi)有報(bào)錯(cuò),但也沒(méi)有成功。也許對(duì)于null和undefined來(lái)說(shuō),它們就是值。而變量則是尋找值。我們說(shuō)javascript是如何區(qū)分變量和關(guān)鍵字,最終或許就變成了javascript是如何區(qū)分變量和值的。
分號(hào)
在一些JS插件中,經(jīng)常會(huì)看到類似下面這樣的一行代碼
;(function(){
.........
})();
在代碼的最前面有一個(gè)分號(hào),那么這個(gè)分號(hào)是干什么用的呢?
我們知道一個(gè)分號(hào)代表了一段代碼的結(jié)束,但問(wèn)題是javascript允許你不寫分號(hào),這樣就出現(xiàn)了一個(gè)問(wèn)題,代碼的結(jié)束與否不是你來(lái)決定的而是由程序來(lái)決定的,而程序也不是萬(wàn)能的,往往它只是走的某個(gè)規(guī)則,而如果你寫的這段代碼和它的規(guī)則不符,最終的結(jié)果就有些不如人意了。
以下是javascript對(duì)省略分號(hào)的解析規(guī)則
var a = 1 + 2 console.log(a) //3
javascript解析器會(huì)將以上代碼解析成
var a = 1 + 2; console.log(a); //3
如果javascript不給2后面添加分號(hào)將會(huì)無(wú)法解析下去,也可以這么說(shuō),如果遇到無(wú)法解析下去則javascript解析器會(huì)嘗試給其添加一個(gè)分號(hào),如果還是解析不了則報(bào)錯(cuò)。又比如下面這一段代碼
var a = 10; var b = 5; var c = a + b (a + b).toString() // b is not a function
它說(shuō)b不是一個(gè)函數(shù),也就是說(shuō)以上這段代碼很有可能解析成了下面這段代碼
var a = 10; var b = 5; var c = a + b(a + b).toString();
它把()當(dāng)成了函數(shù)調(diào)用。也可以理解為javascript解析器會(huì)盡可能多的去匹配,但也有幾個(gè)例外,它們是retrun、break、continue,當(dāng)javascript解析器解析到這幾個(gè)關(guān)鍵字時(shí),它不會(huì)把換行后的內(nèi)容當(dāng)成是自身的,而是直接在換行之前添加分號(hào),不妨看看下面這段代碼
function test(){
return
123;
}
console.log(test()); //undefined
它并沒(méi)有返回123,也就是說(shuō)它直接在retrun后面加了分號(hào)。
再回過(guò)頭來(lái)看看,那些插件開發(fā)者為什么要在代碼第一行添加一個(gè)分號(hào)?
既然是插件,自然是給別人用的對(duì)吧,可關(guān)鍵問(wèn)題是你也不清楚使用這個(gè)插件的人它的代碼是如何編寫的,這好像挺謬論的,它的代碼和我們有什么關(guān)系呢。
如果說(shuō)使用者的代碼會(huì)影響我們的代碼,那么它又是如何影響的呢?比如我們正在編寫類似下面這樣的一段代碼
<script src="test.js"></script> <script src="zmz.js"></script>
第一個(gè)腳本是使用者自己寫的,第二個(gè)腳本是引入的某個(gè)插件,那么瀏覽器又是如何解析這兩個(gè)腳本的呢?不妨我們來(lái)測(cè)試一下
test.js
var a a
zmz.js
(1+2)
如果你運(yùn)行起來(lái)會(huì)發(fā)現(xiàn)并沒(méi)有報(bào)錯(cuò),也就是說(shuō)javascript解析器并不會(huì)因?yàn)榍懊孢@個(gè)文件沒(méi)有加分號(hào)而和后一個(gè)文件中的代碼一起解析。
問(wèn)題倒不在這,而是有可能你剛剛看了一本關(guān)于HTTP的書,哇靠,原來(lái)把文件合并可以減少請(qǐng)求數(shù),于是乎這兩個(gè)腳本融為一體了。搖身一變成了下面這樣
var a a(1+2)
你說(shuō)這能不出錯(cuò)嗎,如果我們?cè)诓寮囊婚_始就加上分號(hào),這種事情就不可能出現(xiàn)。
var a a;(1+2)
因此不要把分號(hào)單單認(rèn)為只是用來(lái)結(jié)束某段代碼,它還可以用來(lái)隔離某段代碼和別人劃清界限。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- 淺析Javascript的自動(dòng)分號(hào)插入(ASI)機(jī)制
- javascript 分號(hào)總結(jié)及詳細(xì)介紹
- 如何防止JavaScript自動(dòng)插入分號(hào)
- 淺談javascript的分號(hào)的使用
- JavaScript中的分號(hào)插入機(jī)制詳細(xì)介紹
- js中關(guān)于一個(gè)分號(hào)的崩潰示例
- JavaScript 自動(dòng)分號(hào)插入(JavaScript synat:auto semicolon insertion)
- JS 分號(hào)引起的一段調(diào)試問(wèn)題
- JavaScript的基本類型值-String類型
- JavaScript基本類型值-Number類型
- JavaScript基本類型值-Undefined、Null、Boolean
相關(guān)文章
setTimeout與setInterval的區(qū)別淺析
這篇文章主要給大家介紹了關(guān)于setTimeout與setInterval區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
javascript加號(hào)"+"的二義性說(shuō)明
單個(gè)的加號(hào)作為運(yùn)算符在 JavaScript 中有三種作用。2013-03-03
javascript實(shí)現(xiàn)點(diǎn)擊星星小游戲
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)點(diǎn)擊星星小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12

