能夠快速地錯誤定位,解決問題,是我們開發(fā)中非常重要的一種能力。
從瀏覽器控制臺到運行Node.js的計算機終端,我們到處都會看到錯誤。
這篇文章重點介紹了在JS開發(fā)過程中可能遇到的 7 種錯誤類型。
當數(shù)字超出允許的值范圍時,將拋出此錯誤;或者JS
執(zhí)行進入死循環(huán)。
我們有一個數(shù)組,帶有兩個元素的arr
。 接下來,我們嘗試將數(shù)組擴展為包含90 ** 99 = 2.9512665430652753e + 193
元素。
這個數(shù)字超出了數(shù)組最大的長度范圍。 運行它會拋出RangeError
:
因為我們要增加arr
數(shù)組的數(shù)量超出了JS指定的范圍。
當對變量/項目的引用被破壞時,將引發(fā)此錯誤。 那是變量/項目不存在。
我們有一個變量cat
初始化為"cat"
。 接下來,我們參考cat
變量和dog
變量。 cat
變量存在,而dog
變量不存在。
cat
將返回”cat”,而dog
將引發(fā)參考錯誤,因為在環(huán)境記錄中找不到名稱dog
。
每當我們創(chuàng)建或定義變量時,變量名稱都會寫入環(huán)境記錄中。 此環(huán)境記錄就像鍵值存儲一樣,
每當我們引用變量時,它都會存儲程序中定義的變量。 當在記錄中找到環(huán)境值并提取并返回值時,將以該變量的名稱作為關(guān)鍵字搜索環(huán)境記錄。 調(diào)用尚未定義的函數(shù)。
現(xiàn)在,當我們創(chuàng)建或定義一個沒有賦值的變量時。 該變量以鍵作為變量名稱寫入環(huán)境記錄,但該值將保持未定義狀態(tài)。
稍后為變量分配值時,將在env記錄中搜索該變量,當找到初始未定義值時,該賦值將被覆蓋。
因此,當在環(huán)境記錄中找不到變量名時,JS引擎會引發(fā)ReferenceError
。
注意:未定義的變量不會拋出ReferenceError,因為它存在于環(huán)境記錄中只是它的值尚未設置。
這是我們遇到的最常見的錯誤。 當我們鍵入JS
引擎可以理解的代碼時,會發(fā)生此錯誤。
解析期間,JS
引擎捕獲了此錯誤。 在JS
引擎中,我們的代碼經(jīng)過不同的階段,然后才能在終端上看到這些結(jié)果。
標記化將代碼的源分解為各個單元。 在此階段,將對數(shù)字,關(guān)鍵字,文字,運算符進行整理并分別進行標記。
接下來,生成的令牌流將傳遞到解析階段,由解析器處理。 這是從令牌流生成AST的地方。 AST是我們代碼結(jié)構(gòu)的抽象表示。
在這兩個階段,即標記化和解析,如果我們代碼的語法/源不符合JS的語法規(guī)則,則會使階段失敗并引發(fā)SyntaxError。 例如,
單獨的h
代表什么? 那里的h
破壞了代碼。
因此,我們可以說語法錯誤發(fā)生在解析/編譯期間。
當其他NativeError對象中沒有一個是失敗原因的適當指示時,TypeError用于指示操作失敗。
對錯誤的數(shù)據(jù)類型執(zhí)行操作時會發(fā)生TypeError。 可能是布爾值,但是找到了ing。
例如, 如果我們嘗試將數(shù)字轉(zhuǎn)換為大寫,如下所示:
將拋出一個 TypeError
因為toUpperCase
函數(shù)需要字符串數(shù)據(jù)類型。 toUpperCase
函數(shù)是有意通用的; 它不需要其this
值為String
對象。 因此,可以將其轉(zhuǎn)移到其他類型的對象中用作方法。
如果我們對Objects,Boolean,Symbol,null,undefined
數(shù)據(jù)類型調(diào)用toUpperCase
函數(shù),則只有字符串會轉(zhuǎn)換為大寫或小寫形式,我們將得到TypeError
,因為它操作的數(shù)據(jù)類型錯誤。
這表明使用一種全局URI
處理功能與其定義不兼容。
JS
中的URI
(統(tǒng)一資源指示符)具有以下功能:decodeURI,decodeURIComponent
等。
如果我們使用錯誤的參數(shù)調(diào)用它們中的任何一個,我們將得到URIError
encodeURI
,獲取URI的未編碼版本。 "%"
不是正確的URI,因此引發(fā)了URIError
。
如果對URI進行編碼或解碼有問題,則會引發(fā)
URIError
。
在使用全局eval()
函數(shù)時,此函數(shù)用于識別錯誤。
根據(jù)EcmaSpec 2018
版: 此規(guī)范當前未使用此異常。 保留該對象是為了與本規(guī)范的先前版本兼容。
該錯誤在JS引擎
內(nèi)部發(fā)生,特別是當它有太多數(shù)據(jù)要處理并且堆棧增長超過其關(guān)鍵限制時。
當JS引擎
被太多的遞歸,太多的切換情況等淹沒時,就會發(fā)生這種情況
太多的遞歸,一個簡單的例子是這樣的:
正如我們所說,沒有人能避免犯錯誤。 就我們鍵入代碼而言,這是一個穩(wěn)定的事件。 為了克服它,我們需要知道可以拋出的本機錯誤的類型。 我們在這篇文章中列出了它們,并提供了一些示例來說明它們是如何遇到的。
因此,無論何時在終端或瀏覽器中引發(fā)錯誤,您現(xiàn)在都可以輕松發(fā)現(xiàn)錯誤發(fā)生的位置和方式,并編寫更好,更不易出錯的代碼。
文/H5技術(shù)專家:阿寬老師