成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript的原生錯誤類型

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

從瀏覽器控制臺到運行 Node.js 的終端,我們到處都會看到錯誤。

本文的重點是概述我們在 JS 開發過程中可能遇到的錯誤類型。

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

[[380731]]

1. RangeError

當數字超出允許的值范圍時,將會拋出此錯誤。

例如

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

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

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

  1. $ node errors 
  2. errors.js:4 
  3. arr.length=90**99 
  4.  ^RangeError: Invalid array length 

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

2. ReferenceError

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

例如

  1. const l=console.logconst cat = "cat" 
  2. cat 
  3. dog 

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

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

  1. $ node errors 
  2. errors.js:3 
  3. dog 
  4. ^ReferenceError: dog is not defined 

每當我們創建或定義變量時,變量名稱都會寫入環境記錄中。環境記錄就像鍵值存儲一樣,

  1. +-------------+ 
  2. | Key | Value | 
  3. --------------- 
  4. | cat | "cat" | 
  5. +-------------+ 

每當我們引用變量時,它都會存儲程序中定義的變量。當在記錄中找到環境值并提取并返回值時,將以該變量的名稱作為關鍵字在環境記錄進行搜索。調用尚未定義的函數。

現在,當我們創建或定義一個沒有賦值的變量時。變量將其鍵作為變量名寫入環境記錄,但其值將會保持未定義的狀態。

  1. var catenv record 
  2. +-----------------+ 
  3. | Key | Value | 
  4. ------------------- 
  5. | cat | undefined | 
  6. +-----------------+ 

稍后為變量分配值時,將在環境記錄中搜索該變量,當發現它未定義值時,該賦值將被覆蓋。

  1. var cat 
  2. cat = "cat"env record 
  3. +-------------+ 
  4. | Key | Value | 
  5. --------------- 
  6. | cat | "cat" | 
  7. +-------------+ 

所以當在環境記錄中找不到變量名時,JS 引擎將引發 RefernceError。

  1. +-------------+ 
  2. | Key | Value | 
  3. --------------- 
  4. | cat | "cat" | 
  5. +-------------+cat // "cat", yes, :) it's there 
  6. dog // :( what's this? can't find it 

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

3. SyntaxError

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

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

  • 標記化
  • 解析
  • 解釋

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

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

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

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

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

  1. $ node errors 
  2. errors.js:3 
  3. let cat h = "cat" 
  4.  ^SyntaxError: Unexpected identifier 

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

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

4. TypeError

當其他 NativeError 對象中沒有適當的失敗原因的指示時,TypeError 用于指示操作失敗。

對錯誤的數據類型執行操作時會發生 TypeError,例如:

如果我們嘗試將數字轉換為大寫,如下所示:

  1. const num = 123 
  2. num.toUpperCase() 

這將引發TypeError

  1. $ node errors 
  2. errors.js:4 
  3. num.toUpperCase() 
  4.  ^TypeError: num.toUpperCase is not a function 

因為 toUpperCase 函數需要字符串數據類型。toUpperCase 函數是有意通用的;它不需要其 this 值是 String對象。因此,可以將其轉移到其他種類的對象中用作方法。

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

5. URIError

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

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

如果我們用錯誤的參數去調用其中任何一個,將得會到一個 URIError。

  1. decodeURI("%") 
  2. ^URIError: URI malformed 

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

當 URI 編碼或解碼出現問題時,會引發 URIError。

6. EvalError

當使用全局 eval() 函數時,這用于識別錯誤。

根據 EcmaSpec 2018 版:

此規范當前未使用此異常。保留它目的是為了與本規范的先前版本兼容。

7. InternalError

該錯誤在 JS 引擎內部發生,特別是當它有太多數據要處理并且棧增長超過其關鍵限制的時侯。

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

  1. switch(num) { 
  2.  case 1: 
  3.  ... 
  4.  break 
  5.  case 2: 
  6.  ... 
  7.  break 
  8.  case 3: 
  9.  ... 
  10.  break 
  11.  case 4: 
  12.  ... 
  13.  break 
  14.  case 5: 
  15.  ... 
  16.  break 
  17.  case 6: 
  18.  ... 
  19.  break 
  20.  case 7: 
  21.  ... 
  22.  break 
  23.  ... up to 1000 cases 
  24.  } 

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

  1. function foo() { 
  2.     foo() 
  3. foo() 

總結

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

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

 

責任編輯:趙寧寧 來源: 前端先鋒
相關推薦

2022-03-14 09:33:44

微軟JavaScripTypeScript

2022-05-18 09:01:31

JavaScriptEvalErrorURIError

2020-03-23 08:15:43

JavaScriptError對象函數

2016-12-21 09:35:55

JavaScript原生數組函數

2014-01-22 09:46:42

JavaScript數組

2023-04-17 16:21:20

JavaScriot前端開發

2021-01-14 21:37:01

JavaScript開發代碼

2022-11-17 08:00:18

JavaScript錯誤性能

2022-12-15 08:00:38

JavaScript錯誤性能

2019-06-21 10:13:26

JavaScript錯誤開發

2021-12-30 21:51:10

JavaScript開發內存

2021-06-16 15:04:06

JavaScript內存開發

2021-04-29 00:08:21

JavaScript 檢測文件

2013-12-26 13:36:27

JavaScript技巧

2011-09-05 18:54:37

MTK系統

2011-07-29 10:12:12

JavaScript

2022-08-16 09:03:01

JavaScript前端

2022-07-07 08:30:50

類型注解原生JS

2020-05-21 18:38:49

JavaScript前端技術

2022-09-02 14:29:01

JavaScrip數組屬性
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久国产精品免费免费搜索 | 色婷婷综合久久久中字幕精品久久 | 免费能直接在线观看黄的视频 | 日韩欧美在 | 亚洲高清一区二区三区 | 国产高清视频在线观看 | 亚洲精品一区二区三区蜜桃久 | 亚洲免费网 | 中文字幕av网址 | 东方伊人免费在线观看 | 毛片国产 | www.99热.com| 91在线| 殴美一级片| 97精品久久 | 亚洲国产一区视频 | 国产一区二区三区四区 | 亚洲www | 亚洲精品黄色 | 亚洲人在线观看视频 | 成人精品一区二区 | 欧美综合一区 | 欧洲视频一区二区 | 欧美性jizz18性欧美 | 亚洲精品一区在线观看 | 激情在线视频网站 | 男人天堂网址 | 精品一区二区三区91 | 日韩久久精品电影 | 在线播放中文字幕 | 天天爽夜夜爽精品视频婷婷 | 久草久草久草 | 国产高清视频 | 国产三级 | 国产精品日本一区二区在线播放 | 国产一级视频在线 | 精品一区二区三区电影 | 黄色成人免费在线观看 | 请别相信他免费喜剧电影在线观看 | 91日日| 国产高清视频在线观看 |