js中的分號(hào)
2020/11/12 12:16:23 閱讀:3292
發(fā)布者:3292
js中語(yǔ)句末尾可以不加分號(hào),
很多時(shí)候在做練習(xí)或?qū)憥讉€(gè)頁(yè)面時(shí),我都是不會(huì)加的。雖然知道加了會(huì)好一點(diǎn)。但就是覺(jué)得很敲一句就要多按一次分號(hào)鍵(;)來(lái)加分號(hào),而不加也不怎么樣,然后就不想加了。
也聽(tīng)說(shuō)在對(duì)js壓縮于,會(huì)自動(dòng)給語(yǔ)句加分號(hào)。很多插件的js的首句前面都會(huì)有個(gè);分號(hào),是用來(lái)避免當(dāng)如果合并如下js文件如以下情況時(shí),解釋器可能會(huì)出錯(cuò)。
//代碼塊A
var a = 10;
var b = 5;
var c = a + b
//代碼塊B
('x' + 'y').toString()
報(bào)錯(cuò); 在('x' + 'y').toString() 前面加上分號(hào)就好了。所以,分號(hào)是一件多么重要的事情。
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ū)分變量和值的。
在一些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)。
因此不要把分號(hào)單單認(rèn)為只是用來(lái)結(jié)束某段代碼,它還可以用來(lái)隔離某段代碼和別人劃清界限。