回复下方公众号【面试宝典】,即可获取为你整理的107页后端笔试题。
从浏览器控制台到运行 Node.js 的计算机终端,我们到处都会听到错误。
这篇文章的重点是概述我们在 JS 开发过程中可能遇到的错误类型。
1. 范围错误
当数字超出允许的值范围时,会引发此错误。 例如:
const l = console.log
const arr = [90,88]
arr.length=90**99
我们有一个包含两个元素的 arr。 接下来,我们尝试让该字段包含 90**99==2.9512665430652753e+193 个元素。
这个数字超出了链表的大小所能下降的范围。 所以当运行时它会抛出 RangeError:
$ node errors
errors.js:4
arr.length=90**99
^
RangeError: Invalid array length
由于我们要减少超出JS指定范围的arr字段数量。
2. 引用错误
当对变量/项的引用被破坏或不存在时,会引发此错误。 也就是说,变量/项不存在。
例如,
const l=console.log
const cat = "cat"
cat
dog
我们有一个变量 cat 初始化为“cat”。 接下来,我们引用cat变量和dog变量。 cat 变量存在javascript变量引用,但dog 变量不存在。
cat 将返回“cat”,而dog 将引发一个ReferenceError,因为在环境记录中找不到名为dog 的变量。
$ node errors
errors.js:3
dog
^
ReferenceError: dog is not defined
每当我们创建或定义变量时,变量名都会写入环境记录中。 这个环境记录就像一个通配符存储表,如右图:
+-------------+
| Key | Value |
---------------
| cat | "cat" |
+-------------+
每当我们引用一个变量时,它都会存储程序中定义的变量。 当在记录中找到环境值并且提取并返回该值时,将使用变量名称作为键来搜索环境记录。 调用尚未定义的函数。
如今,当我们创建或定义一个没有形式参数的变量时。 变量会将键作为变量名写入环境记录,但值将保持未定义状态。
var cat
env record
+-----------------+
| Key | Value |
-------------------
| cat | undefined |
+-----------------+
当一个变量稍后被赋值时,将在环境记录中搜索该变量,当找到这个初始未定义值时,该参数将被覆盖。
var cat
cat = "cat"
env record
+-------------+
| Key | Value |
---------------
| cat | "cat" |
+-------------+
因此,当在 env 记录中找不到变量名时,JS 引擎会抛出 ReferenceError 。
+-------------+
| Key | Value |
---------------
| cat | "cat" |
+-------------+
cat // "cat", yes, :) it's there
dog // :( what's this? can't find it
注意:未定义的变量不会引发 ReferenceError,因为它存在于环境记录中,只是其值保持未设置状态。
3. 语法错误
这是我们遇到的最常见的错误。 当我们输入 JS 引擎无法理解的代码时,就会出现此错误。 在解析过程中,JS 引擎捕获了这个错误。
在JS引擎中,我们的代码会经历不同的阶段,然后才能在终端上看到运行结果。
标记化将源代码分解为单独的单元。 在这个阶段,数字、关键字、文字、运算符将被分别分类和标记。 接下来,生成的令牌流将被传递到解析阶段并由解析器进行处理。 这是从令牌生成 AST 的地方。 AST 是我们代码结构的具体数据结构。
在分词和解析两个阶段,如果我们代码的句型不符合JS的句型规则,就会导致执行阶段失败,导致SyntaxError。 例如,
const l = console.log
let cat h =“ cat”
这里的“h”显然是多余的,所以因为这个额外的字符,引擎会抛出一个SyntaxError
$ node errors
errors.js:3
let cat h = "cat"
^
SyntaxError: Unexpected identifier
事实上,Node.js 引擎发现了一个错误,因为这个不和谐字符的出现,导致了 cat 变量的声明失败。
4.类型错误
TypeError 是指当用于表示值的对象的类型不是预期类型时发生的错误。 例如,我们期望它是一个布尔值,但结果却是一个字符串。
另一个例子:
const num = 123
num.toUpperCase()
这会引发TypeError
$ node errors
errors.js:4
num.toUpperCase()
^
TypeError: num.toUpperCase is not a function
因为toUpperCase函数需要字符串数据类型。 toUpperCase 函数故意是通用的; 它不要求 this 值是 String 对象。 为此,可以将其转移到其他类型的对象中作为技巧。
如果我们对对象、布尔值、符号、null、未定义的数据类型调用 toUpperCase 函数javascript变量引用,则只有字符串会被转换为小写或大写,并且我们将得到 TypeError,因为它对错误的数据类型进行操作。
5. URI错误
这说明使用全局 URI 处理函数与其定义不兼容。
JS中的URI(统一资源指示符)有以下功能:decodeURI、decodeURIComponent等。
如果我们使用错误的参数调用其中任何一个,我们将得到一个 URIError。
decodeURI("%")
^
URIError: URI malformed
encodeURI,获取 URI 的未编码版本。 “%”不是正确的 URI,因此引发 URIError。
当编码或解码 URI 出现问题时,会引发 URIError。
6.评估错误
如果非法调用 eval(),则会抛出 EvalError 异常。
根据EcmaSpec2018版本:
JavaScript 不再抛出此异常,但 EvalError 对象仍然兼容。
7. 内部错误
该错误发生在 JS 引擎内部,尤其是当它有太多数据需要处理并且堆栈下降超过其临界限制时。
这种情况只有在 JS 引擎被太多的递归、太多的 switch case 等吞噬时才会发生。
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()
推理
正如我们所说,没有人不犯错误。 就我们输入的代码而言,错误是不可避免的。
但为了防止出现更多错误,我们需要知道抛出了哪些类型的错误以及如何解决它们。
因此,我们在本文中列举了它们,并提供了一些示例来简要解释它们是如何发生的。
-结尾-
近期新课程:
HTML5+CSS 基础知识|JavaScript|计算机基础知识
Vue2.0+Vue3.0|陌陌小程序|陌陌公众号开发|Node.js|node.JS前端|React基础|React项目|Webpack基础|Webpack中级
Vite2|TypeScript 教程|Node.JS|Flutter|Mpvue 教程