自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JavaScript 代碼加不加分號(hào)有什么區(qū)別

開發(fā) 前端
這個(gè)問題在很多文章找那個(gè)都討論過,在 ESlint 規(guī)范中也因?yàn)榧硬患臃痔?hào)而分為兩大陣營(yíng),到于加不加分號(hào),關(guān)鍵是需要了解分號(hào)對(duì)于 JavaScript 的影響,開始之前可以先看看這道面試題:

 這個(gè)問題在很多文章找那個(gè)都討論過,在 ESlint 規(guī)范中也因?yàn)榧硬患臃痔?hào)而分為兩大陣營(yíng),到于加不加分號(hào),關(guān)鍵是需要了解分號(hào)對(duì)于 JavaScript 的影響,開始之前可以先看看這道面試題:

[[352189]]

請(qǐng)問這段代碼是否能夠正常運(yùn)行?

 

  1. var a = 1 
  2. (function() { 
  3.   console.log(2) 
  4. })() 

。

。

。

。

如果運(yùn)行這段代碼,會(huì)出現(xiàn)下面的錯(cuò)誤:

 

  1. Uncaught TypeError: 1 is not a function 

什么鬼!1 is not a function ?我們沒有打算運(yùn)行數(shù)字 1,為什么說數(shù)字 1 不是函數(shù),這種錯(cuò)誤是很難找到原因的,經(jīng)常會(huì)在出問題的代碼行上打轉(zhuǎn)。這個(gè)錯(cuò)誤必然是上嗎的代碼在運(yùn)行時(shí)被看作是同一行,其概念如下:

 

  1. var a = 1(function() { /* */ })() 

因此立即函數(shù)的 () 被附加在 1 上,這是一個(gè)調(diào)用函數(shù)的語(yǔ)法,所以會(huì)產(chǎn)生 1 is not a function 的錯(cuò)誤,想要避免這個(gè)錯(cuò)誤就需要使用分號(hào):

  1. var a = 1 // 隨便把分號(hào)放在哪里,只要能隔開就行 
  2. ;(function() { 
  3.   console.log(2) 
  4. })() 

ASI 自動(dòng)加入分號(hào)

ASI是 “Automatic Semicolon Insertion” 的縮寫,在運(yùn)行時(shí)會(huì)往有些折行的代碼中自動(dòng)插入分號(hào),這個(gè)機(jī)制可以使部分代碼在沒有加入分號(hào)時(shí)也能正常運(yùn)行,比如下面的例子:

 

  1. var b = 1 
  2. ++b 
  3. console.log('b', b) 

由于代碼中的 ++ 屬于一元表達(dá)式,它只能在表達(dá)式的左邊或右邊放置變量,如果沒有 ASI 的機(jī)制,代碼會(huì)被轉(zhuǎn)換為 var b = 1 ++ b 這樣的錯(cuò)誤語(yǔ)句。不過好在有 ASI,在實(shí)際運(yùn)行時(shí)會(huì)自動(dòng)被加入分號(hào),也就不會(huì)出現(xiàn)上面的錯(cuò)誤。

 

  1. var b = 1; 
  2. ++b; 
  3. console.log('b', b); // 2 

return 與分號(hào)的關(guān)系

再來(lái)看一個(gè)例子,下面的代碼在 return 的后面空一行后再寫要返回的值,那么問運(yùn)行結(jié)果是什么呢?

 

  1. function fn() { 
  2.   return  
  3.   '小明' 
  4. console.log(fn()) 

這段程序代碼因?yàn)?ASI 的修正,return 的后面會(huì)被加上一個(gè)分號(hào),所以 return 與預(yù)期返回的值被分開了,結(jié)果 return 的內(nèi)容為空值,最終的結(jié)果也只能是 undefined 。

 

  1. function fn() { 
  2.   return
  3.   '小明'
  4. console.log(fn()); // undefined 

到底應(yīng)該怎樣處理分號(hào)

本來(lái) ASI 是出于一片好心,用來(lái)修正沒有加入分號(hào)的代碼片段,但偏偏在有的地方并沒有發(fā)揮它的作用(例如本文一開始所介紹的立即函數(shù)),導(dǎo)致代碼出現(xiàn)了錯(cuò)誤;甚至有些代碼不會(huì)出錯(cuò),但會(huì)使你的代碼執(zhí)行結(jié)果和預(yù)期相差萬(wàn)里。

解決 ASI 問題的方式如下:

  • 無(wú)論如何都要加上分號(hào),完全由自己決定代碼的分割
  • 牢記不會(huì)自動(dòng)加入分號(hào)的規(guī)則,當(dāng)不會(huì)自動(dòng)插入分號(hào)時(shí),則手動(dòng)加入

不會(huì)被自動(dòng)加入分號(hào)的規(guī)則

下面時(shí)各種不會(huì)自動(dòng)加入分號(hào)的規(guī)則:

1.新行的代碼是從 (、[、/ 字符開始的,這類情況一般會(huì)直接出現(xiàn) Uncaught TypeError 從而導(dǎo)致代碼無(wú)法運(yùn)行。

 

  1. var a = 1 
  2. var b = a 
  3. (a + b).toString() 
  4.  
  5. var a = 1 
  6. [1,2,3].forEach(bar) 
  7.   
  8. (function() { })() 
  9. (function() { })() 
  10.   
  11. var a = 1 
  12. var b = a 
  13. /test/.test(b) 

2.行以 +,-,*,% 開始,這類情況大多會(huì)影響運(yùn)算結(jié)果,所以應(yīng)該合并為一行。

 

  1. var a = 2 
  2. var b = a 
  3. +a 

3.新行以 , 或 . 開始,這種用法經(jīng)常會(huì)出現(xiàn),主要是為了避免代碼過長(zhǎng)而加入的分隔,這種情況并不會(huì)影響運(yùn)行,如果善用的話會(huì)使代碼更容易閱讀。

 

  1. var a = 2 
  2. var b = a 
  3.   .toString() 
  4. console.log(typeof b) 
  5.   
  6. var a = 1 
  7. ,b = 2 // b 同樣會(huì)被 var 聲明 

如果遇到需要加入分號(hào)的情況,除了可以在語(yǔ)句的末尾加入分號(hào)外,也可以把分號(hào)加在“不會(huì)自動(dòng)加入分號(hào)”的最前方,例如 () 本身不會(huì)自動(dòng)加入分號(hào),在有這種需求時(shí)可以將 ; 加到前面(ESLint Standard JS 規(guī)范就用這個(gè)方法避免錯(cuò)誤)。

 

  1. // 運(yùn)行錯(cuò)誤 
  2. (function() { })() 
  3. (function() { })() 
  4.   
  5. // 正確 
  6. ;(function() { })() 
  7. ;(function() { })() 

總結(jié)

有的人認(rèn)為不加分號(hào)可以讓代碼看起來(lái)更干凈和精簡(jiǎn),而且在大部分情況下并不會(huì)出現(xiàn)錯(cuò)誤,所以很多人在敲代碼時(shí)不會(huì)加分號(hào)。

不過我更傾向于更嚴(yán)格的規(guī)范,也許是因?yàn)槲沂菑暮蠖宿D(zhuǎn)到前端的,習(xí)慣了。至于到底怎么選,只要搞清楚運(yùn)行上的限制,不管哪種風(fēng)格都是挺不錯(cuò)的,只要你喜歡就好。

責(zé)任編輯:華軒 來(lái)源: 前端先鋒
相關(guān)推薦

2020-08-02 23:20:36

JavaScriptmap()forEach()

2020-03-23 11:28:56

PythonJavaScript技術(shù)

2024-05-06 10:55:38

2020-09-04 06:27:22

編碼命令式聲明式代碼

2020-03-09 20:56:19

LoRaLoRaWAN無(wú)線技術(shù)

2018-07-13 17:05:22

SQLMySQL數(shù)據(jù)庫(kù)

2022-09-07 18:32:57

并發(fā)編程線程

2020-11-09 14:07:53

PyQtQt編程

2023-10-13 15:48:17

OT系統(tǒng)

2022-06-06 14:53:02

LoRaLoRaWAN

2022-09-08 18:38:26

LinuxWindowsmacOS

2020-09-25 08:19:51

SecOps vs D

2021-12-17 14:40:02

while(1)for(;;)語(yǔ)言

2022-02-27 15:33:22

安全CASBSASE

2022-09-13 10:23:52

MLOpsDevOps開發(fā)

2020-12-22 13:46:48

APISKD

2022-08-02 08:23:37

SessionCookies

2024-03-05 18:59:59

前端開發(fā)localhost

2024-05-27 00:40:00

2024-09-09 13:10:14

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)