javascript变量引用-你知道这 7 个常见的 JavaScript 错误吗?

2023-08-26 0 5,786 百度已收录

回复下方公众号【面试宝典】,即可获取为你整理的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 |
+-----------------+

当一个变量稍后被赋值时,将在环境记录中搜索该变量,当找到这个初始未定义值时,该参数将被覆盖。

javascript变量引用-你知道这 7 个常见的 JavaScript 错误吗?

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等。

javascript变量引用-你知道这 7 个常见的 JavaScript 错误吗?

如果我们使用错误的参数调用其中任何一个,我们将得到一个 URIError。

decodeURI("%")
^

URIError: URI malformed

encodeURI,获取 URI 的未编码版本。 “%”不是正确的 URI,因此引发 URIError。

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

6.评估错误

如果非法调用 eval(),则会抛出 EvalError 异常。

根据EcmaSpec2018版本:

JavaScript 不再抛出此异常,但 EvalError 对象仍然兼容。

7. 内部错误

该错误发生在 JS 引擎内部,尤其是当它有太多数据需要处理并且堆栈下降超过其临界限制时。

这种情况只有在 JS 引擎被太多的递归、太多的 switch case 等吞噬时才会发生。

javascript变量引用-你知道这 7 个常见的 JavaScript 错误吗?

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 教程

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 javascript javascript变量引用-你知道这 7 个常见的 JavaScript 错误吗? https://www.wkzy.net/game/158833.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务