JS原生错误类型常见的有几种,是怎样的
Admin 2022-07-20 群英技术资讯 927 次浏览
这篇文章主要介绍“JS原生错误类型常见的有几种,是怎样的”的相关知识,下面会通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JS原生错误类型常见的有几种,是怎样的”文章能帮助大家解决问题。从浏览器控制台到运行 Node.js的终端,我们到处都会看到错误。本文的重点是概述我们在js开发过程中可能遇到的错误类型。
提示:良好的错误提示会导致快速而无痛的发展经历与缓慢而痛苦的发展经历之间的区别。在编写可重用的代码时,请确保自己在编写清晰易懂的错误处理代码。
当数字超出允许的值范围时,将会抛出此错误。
例如
const l = console.logconst 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
因为我们要增加 arr 数组的大小超出了 JS 指定的范围。
当对变量或项目的引用被破坏时,将会引发此错误。那是变量或项目不存在。
例如
const l=console.logconst cat = "cat" cat dog
有一个变量cat被初始化为 “cat”。接下来引用了cat变量和dog变量。cat变量存在,而dog变量不存在。
cat将返回 “cat”,而dog将引发引用错误,因为在环境记录中找不到名称dog。
$ node errors
errors.js:3
dog
^ReferenceError: dog is not defined
每当我们创建或定义变量时,变量名称都会写入环境记录中。环境记录就像键值存储一样,
+-------------+
| Key | Value |
---------------
| cat | "cat" |
+-------------+
每当我们引用变量时,它都会存储程序中定义的变量。当在记录中找到环境值并提取并返回值时,将以该变量的名称作为关键字在环境记录进行搜索。调用尚未定义的函数。
现在,当我们创建或定义一个没有赋值的变量时。变量将其键作为变量名写入环境记录,但其值将会保持未定义的状态。
var catenv record
+-----------------+
| Key | Value |
-------------------
| cat | undefined |
+-----------------+
稍后为变量分配值时,将在环境记录中搜索该变量,当发现它未定义值时,该赋值将被覆盖。
var cat
cat = "cat"env record
+-------------+
| Key | Value |
---------------
| cat | "cat" |
+-------------+
所以当在环境记录中找不到变量名时,JS 引擎将引发 RefernceError。
+-------------+
| Key | Value |
---------------
| cat | "cat" |
+-------------+cat // "cat", yes, :) it's there
dog // :( what's this? can't find it
注意:未定义的变量不会抛出 ReferenceError,因为它在于环境记录中的值尚未设置。
这是最常见的错误。当我们输入 JS 引擎不能理解的代码时,就会发生这个错误。
JS 引擎在解析期间捕获了这个错误。在 JS 引擎中,我们的代码经历了不同的阶段,然后才能在终端上看到结果。
标记化将代码的源分解为各个单元。在此阶段,将对数字、关键字、文字、运算符进行分类并分别标记。
接下来,生成的标记流将会传递到解析阶段,由解析器处理。这是从标记流生成 AST 的地方。 AST 是代码结构的抽象表示。
在标记化和解析这两个阶段,如果我们代码的语法不符合 JS 的语法规则,则会使该阶段失败并引发 SyntaxError。例如:
const l = console.loglet cat h = "cat"
代码中的 “h” 代表什么?这个 “h” 破坏了代码。
$ node errors
errors.js:3
let cat h = "cat"
^SyntaxError: Unexpected identifier
看,Node.js 指出了问题的所在。它说 “h” 是意外的,它破坏了cat 变量的声明。
因此,可以说语法错误在解析或编译期间发生。
当其他 NativeError 对象中没有适当的失败原因的指示时,TypeError 用于指示操作失败。
对错误的数据类型执行操作时会发生 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对象。因此,可以将其转移到其他种类的对象中用作方法。
只有字符串才会转换为大写或小写形式,如果我们在 Objects、Boolean、Symbol、null、undefined 数据类型上调用toUpperCase函数,则将会得到 TypeError,因为它操作的数据类型错误。
这表明使用了一种与其定义不兼容的全局 URI 处理函数。
JS 中的 URI(统一资源指示符)具有以下功能:decodeURI、decodeURIComponent 等。
如果我们用错误的参数去调用其中任何一个,将得会到一个 URIError。
decodeURI("%")
^URIError: URI malformed
encodeURI用于获取 URI 的未编码版本。 “%” 不是正确的 URI,因此引发了URIError。
当 URI 编码或解码出现问题时,会引发 URIError。
当使用全局eval()函数时,这用于识别错误。
根据 EcmaSpec 2018 版:
此规范当前未使用此异常。保留它目的是为了与本规范的先前版本兼容。
该错误在 JS 引擎内部发生,特别是当它有太多数据要处理并且栈增长超过其关键限制的时侯。
当 JS 引擎被过多的递归和切换情况等淹没时,就会发生这种问题
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()
正如我们所说,谁都会犯错误。就我们敲代码这件事而言,这是一个稳定的事件。为了克服它,我们需要知道可以抛出的原生错误的类型。本文中列出了它们,并提供了一些示例来说明它们是如何引发的。
所以无论什么时候在终端或浏览器中引发错误,你都可以轻松发现错误产生的位置和方式,并能够编写更好、更不易出错的代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
浅谈vue的第一个commit分析,为什么写这篇vue的分析文章?对于天资愚钝的前端(我)来说,阅读源码是件不容易的事情,毕竟有时候看源码分析的文章都看不懂。
今天给大家分享一个比较有趣的实例,相信很多朋友都有抢过微信红包吧,有的人红包抢到的金额的多,有的人抢到的少,那么大家是否有好奇这是怎样实现的,下面小编就给大家介绍一下用JavaScript实现指定红包金额的算法,感兴趣的朋友就继续往下看吧。
在学习JavaScript时,JavaScript事件的知识是需要掌握的。因此这篇文章就给大家简单的介绍一下JavaScript事件的概念,常用事件,事件的注册等等,有这方面学习需求的朋友可以了解一下。
线程和进程是计算机操作系统的基础概念,在程序员中属于高频词汇,那如何理解呢?Node.js 中的进程和线程又是怎样的呢?下面本篇文章就来一起了解一下,希望对大家有所帮助!
一分钟理解JavaScript闭包,关于JavaScript闭包的内容介绍了很多,本文带着大家快速理解什么是JavaScript闭包,感兴趣的小伙伴们可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008