你应该知道的7 个 JavaScript 原生错误类型

你应该知道的7 个 JavaScript 原生错误类型

疯狂的技术宅 前端先锋 javascript

翻译:疯狂的技术宅
做者:Chidume Nnamdi
来源:bitsrc
正文共:2260 字
预计阅读时间:7 分钟你应该知道的7 个 JavaScript 原生错误类型前端

从浏览器控制台到运行 Node.js 的终端,咱们处处都会看到错误。java

本文的重点是概述咱们在 JS 开发过程当中可能遇到的错误类型。node

1. RangeError

当数字超出容许的值范围时,将会抛出此错误。数组

例如浏览器

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

咱们有一个数组,带有两个元素的 arr。接下来,尝试将数组扩展为包含 90**99 == 2.9512665430652753e+193 个元素。markdown

这个数字超出了数组大小能够增加的范围。运行它会抛出 RangeError:ide

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

由于咱们要增长 arr 数组的大小超出了 JS 指定的范围。函数

2. ReferenceError

当对变量或项目的引用被破坏时,将会引起此错误。那是变量或项目不存在。this

例如

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

有一个变量 cat 被初始化为 “cat”。接下来引用了 cat 变量和 dog 变量。cat 变量存在,而 dog 变量不存在。

cat 将返回 “cat”,而 dog 将引起引用错误,由于在环境记录中找不到名称 dog。

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

每当咱们建立或定义变量时,变量名称都会写入环境记录中。环境记录就像键值存储同样,

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

每当咱们引用变量时,它都会存储程序中定义的变量。当在记录中找到环境值并提取并返回值时,将以该变量的名称做为关键字在环境记录进行搜索。调用还没有定义的函数。

如今,当咱们建立或定义一个没有赋值的变量时。变量将其键做为变量名写入环境记录,但其值将会保持未定义的状态。

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

稍后为变量分配值时,将在环境记录中搜索该变量,当发现它未定义值时,该赋值将被覆盖。

1var cat
2cat = "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
6dog // :( what's this? can't find it

注意:未定义的变量不会抛出 ReferenceError,由于它在于环境记录中的值还没有设置。

3. SyntaxError

这是最多见的错误。当咱们输入 JS 引擎不能理解的代码时,就会发生这个错误。

JS 引擎在解析期间捕获了这个错误。在 JS 引擎中,咱们的代码经历了不一样的阶段,而后才能在终端上看到结果。

  • 标记化
  • 解析
  • 解释
    标记化将代码的源分解为各个单元。在此阶段,将对数字、关键字、文字、运算符进行分类并分别标记。

接下来,生成的标记流将会传递到解析阶段,由解析器处理。这是从标记流生成 AST 的地方。AST 是代码结构的抽象表示。

在标记化和解析这两个阶段,若是咱们代码的语法不符合 JS 的语法规则,则会使该阶段失败并引起 SyntaxError。例如:

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

代码中的 “h” 表明什么?这个 “h” 破坏了代码。

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

看,Node.js 指出了问题的所在。它说 “h” 是意外的,它破坏了cat 变量的声明。

所以,能够说语法错误在解析或编译期间发生。

4. TypeError

当其余 NativeError 对象中没有适当的失败缘由的指示时,TypeError 用于指示操做失败。

对错误的数据类型执行操做时会发生 TypeError,例如:

若是咱们尝试将数字转换为大写,以下所示:

1const num = 123
2num.toUpperCase()

这将引起TypeError

1$ node errors
2errors.js:4
3num.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。

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

encodeURI 用于获取 URI 的未编码版本。“%” 不是正确的 URI,所以引起了URIError。

当 URI 编码或解码出现问题时,会引起 URIError。

6. EvalError

当使用全局 eval() 函数时,这用于识别错误。

根据 EcmaSpec 2018 版:

此规范当前未使用此异常。保留它目的是为了与本规范的先前版本兼容。

7. InternalError

该错误在 JS 引擎内部发生,特别是当它有太多数据要处理而且栈增加超过其关键限制的时侯。

当 JS 引擎被过多的递归和切换状况等淹没时,就会发生这种问题

1switch(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 }

如下是一个简单的过多递归的例子:

unction foo() {
foo()

oo()

总结

正如咱们所说,谁都会犯错误。就咱们敲代码这件事而言,这是一个稳定的事件。为了克服它,咱们须要知道能够抛出的原生错误的类型。本文中列出了它们,并提供了一些示例来讲明它们是如何引起的。

因此不管何时在终端或浏览器中引起错误,你均可以轻松发现错误产生的位置和方式,并可以编写更好、更不易出错的代码。

原文连接

https://blog.bitsrc.io/types-of-native-errors-in-javascript-you-must-know-b8238d40e492

相关文章
相关标签/搜索