当前位置: 首页 > 科技观察

JavaScript的原生错误类型

时间:2023-03-12 02:11:49 科技观察

从浏览器控制台到运行Node.js的终端,我们到处都能看到错误。本文的目的是概述我们在JS开发过程中可能遇到的错误类型。提示:好的失误可能会导致快速而无痛的发展体验,或缓慢而痛苦的发展体验。编写可重用代码时,请确保您编写的是清晰易懂的错误处理代码。1.RangeError当数字超出允许的取值范围时会抛出这个错误。例如constl=console.logconstarr=[90,88]arr.length=90**99我们有一个数组,arr有两个元素。接下来,尝试扩展数组以包含90**99==2.9512665430652753e+193个元素。这个数字超出了数组大小可以增长的范围。运行它会抛出RangeError:$nodeerrorserrors.js:4arr.length=90**99^RangeError:Invalidarraylength因为我们要增加arr数组的大小超出JS指定的范围。2.ReferenceError当对变量或项目的引用被破坏时,将引发此错误。那是变量或项目不存在。例如constl=console.logconstcat="cat"catdog有一个初始化为“cat”的变量cat。接下来,引用cat变量和dog变量。cat变量存在,但dog变量不存在。cat将返回“cat”,而dog将抛出引用错误,因为在环境记录中找不到名称dog。$nodeerrorserrors.js:3dog^ReferenceError:dogisnotdefined每当我们创建或定义一个变量时,变量名都会被写入环境记录。环境记录就像键值存储,+------------+|Key|Value|--------------|cat|"cat"|+------------+每当我们引用一个变量时,它存储的是程序中定义的变量。当在记录中找到环境值并提取并返回该值时,将使用变量名称作为键搜索环境记录。调用一个尚未定义的函数。现在,当我们创建或定义一个变量而不赋值时。变量会将它们的键作为变量名写入环境记录,但它们的值将保持未定义状态。varcatenvrecord+----------------+|Key|Value|--------------------|cat|undefined|+---------------+后面给一个变量赋值时,会去环境记录中查找那个变量,发现没有定义值时,就会赋值被覆盖。varcatcat="cat"envrecord+------------+|Key|Value|--------------|cat|"cat"|+------------+所以当环境记录中没有找到变量名时,JS引擎会抛出一个ReferenceError。+------------+|键|值|------------|猫|“猫”|+------------+cat//"cat",yes,:)it'stheredog//:(what'sthis?can'tfindit注意:未定义的变量不会抛出ReferenceError因为它在环境记录中valueofhasnotbeenbeenset.3.SyntaxError这个是最常见的错误,当我们输入JS引擎不理解的代码时就会出现这个错误,JS引擎在解析的时候会捕捉到这个错误,在JS引擎中,我们的代码会经过在终端上看到结果之前的不同阶段。TokenizationParsingExplanationTokenization将代码的源分解为单独的单元。在这个阶段,数字,关键字,文字,运算符被分类并分别标记。接下来,生成的标记流被传递到解析阶段,由解析器处理。这是从令牌流生成AST的地方。AST是代码结构的抽象表示。在令牌化和解析两个阶段ing,如果我们的代码语法不符合JS的语法规则,这个阶段就会失败,会抛出一个SyntaxError。例如:constl=console.logletcath="cat"代码中的“h”代表什么?这个“h”破坏了密码。$nodeerrorserrors.js:3letcath="cat"^SyntaxError:Unexpectedidentifier看,Node.js指出了问题。它说“h”是意外的,它破坏了cat变量的声明。因此,可以说是在解析或编译时出现了语法错误。4.TypeError用于在其他NativeError对象中没有指示合适的失败原因时指示操作失败。当对错误的数据类型执行操作时会发生TypeError,例如:如果我们尝试像这样将数字转换为大写:constnum=123num.toUpperCase()这将引发TypeError$nodeerrorserrors.js:4num.toUpperCase()^TypeError:num.toUpperCase不是函数,因为toUpperCase函数需要字符串数据类型。toUpperCase函数是有意通用的;它不需要它的this值是一个String对象。因此,它可以被转移以用作其他种类对象中的方法。只有字符串被转换为大写或小写,如果我们在Objects、Boolean、Symbol、null、undefined数据类型上调用toUpperCase函数,我们将得到TypeError,因为它对错误的数据类型进行操作。5.URIError这表示使用了与其定义不兼容的全局URI处理函数。JS中的URI(UniformResourceIndicator)有如下函数:decodeURI、decodeURIComponent等,如果我们调用其中任何一个参数错误,都会得到URIError。decodeURI("%")^URIError:URImalformedencodeURI用于获取URI的未编码版本。“%”不是有效的URI,因此引发了URIError。当URI编码或解码出现问题时,会引发URIError。6.EvalError这用于在使用全局eval()函数时识别错误。根据EcmaSpec2018版:此规范当前未使用此异常。保留它是为了与本规范的先前版本兼容。7.InternalError这个错误发生在JS引擎内部,特别是当它有太多的数据要处理并且堆栈增长超过其临界限制时。当JS引擎被太多的递归和switchcase等淹没时,就会发生这个问题。switch(num){case1:...breakcase2:...breakcase3:...breakcase4:...breakcase5:.....breakcase7:...break...upto1000cases}下面是一个过多递归的简单示例:functionfoo(){foo()}foo()总结正如我们所说,每个人都会犯错。就我们输入代码而言,这是一个稳定的事件。为了克服它,我们需要知道可以抛出的本机错误的类型。本文列出了它们并提供了一些如何触发它们的示例。因此,无论何时在终端或浏览器中出现错误,您都可以轻松发现错误发生的位置和方式,并能够编写更好、更不容易出错的代码。