最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

7個你應(yīng)該知道的JS原生錯誤類型

 更新時間:2021年04月29日 10:38:10   作者:淺笑·  
這篇文章主要介紹了7個你應(yīng)該知道的JS原生錯誤類型,對此感興趣的同學(xué),可以參考一下

概述

從瀏覽器控制臺到運行 Node.js的終端,我們到處都會看到錯誤。本文的重點是概述我們在js開發(fā)過程中可能遇到的錯誤類型。

提示:良好的錯誤提示會導(dǎo)致快速而無痛的發(fā)展經(jīng)歷與緩慢而痛苦的發(fā)展經(jīng)歷之間的區(qū)別。在編寫可重用的代碼時,請確保自己在編寫清晰易懂的錯誤處理代碼。

1. RangeError

當(dāng)數(shù)字超出允許的值范圍時,將會拋出此錯誤。

例如

const l = console.logconst arr = [90,88]
arr.length=90**99

我們有一個數(shù)組,帶有兩個元素的 arr。接下來,嘗試將數(shù)組擴展為包含90**99 == 2.9512665430652753e+193個元素。

這個數(shù)字超出了數(shù)組大小可以增長的范圍。運行它會拋出 RangeError:

$ node errors

errors.js:4

arr.length=90**99

 ^RangeError: Invalid array length

因為我們要增加 arr 數(shù)組的大小超出了 JS 指定的范圍。

2. ReferenceError

當(dāng)對變量或項目的引用被破壞時,將會引發(fā)此錯誤。那是變量或項目不存在。

例如

const l=console.logconst cat = "cat"
cat
dog

有一個變量cat被初始化為 “cat”。接下來引用了cat變量和dog變量。cat變量存在,而dog變量不存在。

cat將返回 “cat”,而dog將引發(fā)引用錯誤,因為在環(huán)境記錄中找不到名稱dog。

$ node errors

errors.js:3

dog

^ReferenceError: dog is not defined

每當(dāng)我們創(chuàng)建或定義變量時,變量名稱都會寫入環(huán)境記錄中。環(huán)境記錄就像鍵值存儲一樣,

+-------------+

| Key | Value |

---------------

| cat | "cat" |

+-------------+

每當(dāng)我們引用變量時,它都會存儲程序中定義的變量。當(dāng)在記錄中找到環(huán)境值并提取并返回值時,將以該變量的名稱作為關(guān)鍵字在環(huán)境記錄進行搜索。調(diào)用尚未定義的函數(shù)。

現(xiàn)在,當(dāng)我們創(chuàng)建或定義一個沒有賦值的變量時。變量將其鍵作為變量名寫入環(huán)境記錄,但其值將會保持未定義的狀態(tài)。

var catenv record

+-----------------+

| Key | Value |

-------------------

| cat | undefined |

+-----------------+

稍后為變量分配值時,將在環(huán)境記錄中搜索該變量,當(dāng)發(fā)現(xiàn)它未定義值時,該賦值將被覆蓋。

var cat

cat = "cat"env record

+-------------+

| Key | Value |

---------------

| cat | "cat" |

+-------------+

所以當(dāng)在環(huán)境記錄中找不到變量名時,JS 引擎將引發(fā) RefernceError。

+-------------+

| Key | Value |

---------------

| cat | "cat" |

+-------------+cat // "cat", yes, :) it's there

dog // :( what's this? can't find it

注意:未定義的變量不會拋出 ReferenceError,因為它在于環(huán)境記錄中的值尚未設(shè)置。

3. SyntaxError

這是最常見的錯誤。當(dāng)我們輸入 JS 引擎不能理解的代碼時,就會發(fā)生這個錯誤。

JS 引擎在解析期間捕獲了這個錯誤。在 JS 引擎中,我們的代碼經(jīng)歷了不同的階段,然后才能在終端上看到結(jié)果。

  • 標記化
  • 解析
  • 解釋

標記化將代碼的源分解為各個單元。在此階段,將對數(shù)字、關(guān)鍵字、文字、運算符進行分類并分別標記。

接下來,生成的標記流將會傳遞到解析階段,由解析器處理。這是從標記流生成 AST 的地方。 AST 是代碼結(jié)構(gòu)的抽象表示。

在標記化和解析這兩個階段,如果我們代碼的語法不符合 JS 的語法規(guī)則,則會使該階段失敗并引發(fā) SyntaxError。例如:

const l = console.loglet cat h = "cat"

代碼中的 “h” 代表什么?這個 “h” 破壞了代碼。

$ node errors

errors.js:3

let cat h = "cat"

 ^SyntaxError: Unexpected identifier

看,Node.js 指出了問題的所在。它說 “h” 是意外的,它破壞了cat 變量的聲明。

因此,可以說語法錯誤在解析或編譯期間發(fā)生。

4. TypeError

當(dāng)其他 NativeError 對象中沒有適當(dāng)?shù)氖≡虻闹甘緯r,TypeError 用于指示操作失敗。

對錯誤的數(shù)據(jù)類型執(zhí)行操作時會發(fā)生 TypeError,例如:

如果我們嘗試將數(shù)字轉(zhuǎn)換為大寫,如下所示:

const num = 123
num.toUpperCase()

這將引發(fā)TypeError

$ node errors

errors.js:4

num.toUpperCase()

 ^TypeError: num.toUpperCase is not a function

因為toUpperCase函數(shù)需要字符串?dāng)?shù)據(jù)類型。toUpperCase函數(shù)是有意通用的;它不需要其this值是String對象。因此,可以將其轉(zhuǎn)移到其他種類的對象中用作方法。

只有字符串才會轉(zhuǎn)換為大寫或小寫形式,如果我們在 Objects、Boolean、Symbol、null、undefined 數(shù)據(jù)類型上調(diào)用toUpperCase函數(shù),則將會得到 TypeError,因為它操作的數(shù)據(jù)類型錯誤。

5. URIError

這表明使用了一種與其定義不兼容的全局 URI 處理函數(shù)。

JS 中的 URI(統(tǒng)一資源指示符)具有以下功能:decodeURI、decodeURIComponent 等。

如果我們用錯誤的參數(shù)去調(diào)用其中任何一個,將得會到一個 URIError。

decodeURI("%")
^URIError: URI malformed

encodeURI用于獲取 URI 的未編碼版本。 “%” 不是正確的 URI,因此引發(fā)了URIError。

當(dāng) URI 編碼或解碼出現(xiàn)問題時,會引發(fā) URIError。

6. EvalError

當(dāng)使用全局eval()函數(shù)時,這用于識別錯誤。

根據(jù) EcmaSpec 2018 版:

此規(guī)范當(dāng)前未使用此異常。保留它目的是為了與本規(guī)范的先前版本兼容。

7. InternalError

該錯誤在 JS 引擎內(nèi)部發(fā)生,特別是當(dāng)它有太多數(shù)據(jù)要處理并且棧增長超過其關(guān)鍵限制的時侯。

當(dāng) JS 引擎被過多的遞歸和切換情況等淹沒時,就會發(fā)生這種問題

switch(num) {
 case 1:
 ...
 break
 case 2:
 ...
 break
 case 3:
 ...
 break
 case 4:
 ...
 break
 case 5:
 ...
 break
 case 6:
 ...
 break
 case 7:
 ...
 break
 ... up to 1000 cases
 }

以下是一個簡單的過多遞歸的例子:

function foo() {
    foo()
}
foo()

總結(jié)

正如我們所說,誰都會犯錯誤。就我們敲代碼這件事而言,這是一個穩(wěn)定的事件。為了克服它,我們需要知道可以拋出的原生錯誤的類型。本文中列出了它們,并提供了一些示例來說明它們是如何引發(fā)的。

所以無論什么時候在終端或瀏覽器中引發(fā)錯誤,你都可以輕松發(fā)現(xiàn)錯誤產(chǎn)生的位置和方式,并能夠編寫更好、更不易出錯的代碼。

以上就是7個你應(yīng)該知道的JS原生錯誤類型的詳細內(nèi)容,更多關(guān)于JS原生錯誤類型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 微信小程序-可移動菜單的實現(xiàn)過程詳解

    微信小程序-可移動菜單的實現(xiàn)過程詳解

    這篇文章主要介紹了微信小程序-可移動菜單的實現(xiàn)過程詳解,我們可以經(jīng)常看到手機app里有的菜單欄是懸浮在首頁的,用戶可以拖動和點擊菜單欄進行交互,今天就教大家利用小程序的控件,,需要的朋友可以參考下
    2019-06-06
  • JS判斷頁面加載狀態(tài)以及添加遮罩和緩沖動畫的代碼

    JS判斷頁面加載狀態(tài)以及添加遮罩和緩沖動畫的代碼

    JS判斷頁面加載狀態(tài)以及添加遮罩和緩沖動畫的代碼廢話少說,直接貼代碼!有注釋
    2012-10-10
  • Postman無法正常返回結(jié)果問題解決

    Postman無法正常返回結(jié)果問題解決

    這篇文章主要介紹了Postman無法正常返回結(jié)果問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 微信小程序?qū)崙?zhàn)之網(wǎng)易云音樂歌曲詳情頁實現(xiàn)代碼

    微信小程序?qū)崙?zhàn)之網(wǎng)易云音樂歌曲詳情頁實現(xiàn)代碼

    本文給大家介紹了微信小程序?qū)W習(xí)記錄之網(wǎng)易云音樂歌曲詳情頁代碼實現(xiàn),代碼分為html、css和js部分,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • TypeScript在Vuex4中使用TS實戰(zhàn)分享

    TypeScript在Vuex4中使用TS實戰(zhàn)分享

    這篇文章主要介紹了TypeScript在Vuex4中使用TS實戰(zhàn)分享,vuex4類型?Api分析和vuex4實戰(zhàn)兩部分講述,需要的小伙伴可以參考一下
    2022-06-06
  • js驗證是否為數(shù)字的總結(jié)

    js驗證是否為數(shù)字的總結(jié)

    js驗證是否為數(shù)字的總結(jié),需要的朋友可以參考一下
    2013-04-04
  • 原生JavaScript中直接觸發(fā)事件的方式小結(jié)

    原生JavaScript中直接觸發(fā)事件的方式小結(jié)

    JavaScript提供了多種方式來直接觸發(fā)事件,無論是在用戶交互、程序邏輯處理或是數(shù)據(jù)更新時,本文將全面探討原生JavaScript中各種事件觸發(fā)方式,并通過深入的技術(shù)案例分析,需要的朋友可以參考下
    2025-01-01
  • 原生js實現(xiàn)電子時鐘

    原生js實現(xiàn)電子時鐘

    這篇文章主要為大家詳細介紹了原生js實現(xiàn)電子時鐘,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • JS制作可以選項卡切換的年歷

    JS制作可以選項卡切換的年歷

    這篇文章主要為大家分享了JS制作類似于選項卡切換的年歷,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 對象題目的一個坑 理解Javascript對象

    對象題目的一個坑 理解Javascript對象

    這篇文章主要介紹了Javascript對象,特別為大家分享了對象題目的一個坑,提供了解題思路,感興趣的小伙伴們可以參考一下
    2015-12-12

最新評論

上饶县| 马边| 广东省| 鸡东县| 梧州市| 平顶山市| 精河县| 津南区| 夏河县| 景东| 怀宁县| 黑河市| 武安市| 类乌齐县| 望城县| 南安市| 德格县| 芜湖县| 图片| 微博| 扶绥县| 定州市| 新民市| 方山县| 崇阳县| 南木林县| 花莲市| 衡阳县| 当雄县| 保山市| 阳曲县| 弋阳县| 晋江市| 安庆市| 平潭县| 德江县| 达尔| 三亚市| 永宁县| 天水市| 屏东县|