能够快速地错误定位,解决问题,是我们开发中非常重要的一种能力。

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

这篇文章重点介绍了在JS开发过程中可能遇到的 7 种错误类型。

1、 RangeError 范围错误
当数字超出允许的值范围时,将抛出此错误;或者JS执行进入死循环。

const log = console.log
const arr = [90,88]
arr.length = 90**99

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

这个数字超出了数组最大的长度范围。 运行它会抛出RangeError:

arr.length = 90**99^
RangeError: Invalid array lengthat <anonymous>:3:12

因为我们要增加arr数组的数量超出了JS指定的范围。

2、 ReferenceError 引用错误
当对变量/项目的引用被破坏时,将引发此错误。 那是变量/项目不存在。

const log = console.log
const cat = "cat"
cat
dog

我们有一个变量cat初始化为"cat"。 接下来,我们参考cat变量和dog变量。 cat变量存在,而dog变量不存在。

cat将返回"cat",而dog将引发参考错误,因为在环境记录中找不到名称dog。

dog
^
ReferenceError: dog is not defined

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

+-------------+
| Key | Value |
---------------
| cat | "cat" |
+-------------+

每当我们引用变量时,它都会存储程序中定义的变量。 当在记录中找到环境值并提取并返回值时,将以该变量的名称作为关键字搜索环境记录。 调用尚未定义的函数。
现在,当我们创建或定义一个没有赋值的变量时。 该变量以键作为变量名称写入环境记录,但该值将保持未定义状态。

var cat
env record
+-----------------+
| Key | Value |
-------------------
| cat | undefined |
+-----------------+

稍后为变量分配值时,将在env记录中搜索该变量,当找到初始未定义值时,该赋值将被覆盖。

var cat
cat = "cat"
env record
+-------------+
| Key | Value |
---------------
| cat | "cat" |
+-------------+

因此,当在环境记录中找不到变量名时,JS引擎会引发ReferenceError。

+-------------+
| Key | Value |
---------------
| cat | "cat" |
+-------------+
cat // "cat", yes, :) it's there
dog // :( what's this? can't find it
注意:未定义的变量不会抛出ReferenceError,因为它存在于环境记录中只是它的值尚未设置。

3.SyntaxError 语法错误
这是我们遇到的最常见的错误。 当我们键入JS引擎可以理解的代码时,会发生此错误。
解析期间,JS引擎捕获了此错误。 在JS引擎中,我们的代码经过不同的阶段,然后才能在终端上看到这些结果。

tokenization 标记化
parsing 解析
interpreting 编译

标记化将代码的源分解为各个单元。 在此阶段,将对数字,关键字,文字,运算符进行整理并分别进行标记。
接下来,生成的令牌流将传递到解析阶段,由解析器处理。 这是从令牌流生成AST的地方。 AST是我们代码结构的抽象表示。
在这两个阶段,即标记化和解析,如果我们代码的语法/源不符合JS的语法规则,则会使阶段失败并引发SyntaxError。 例如,

const log = console.log
let cat h = "cat"

单独的h代表什么? 那里的h破坏了代码。

let cat h = "cat"^
SyntaxError: Unexpected identifier

因此,我们可以说语法错误发生在解析/编译期间。

4.TypeError 类型错误
当其他NativeError对象中没有一个是失败原因的适当指示时,TypeError用于指示操作失败。
对错误的数据类型执行操作时会发生TypeError。 可能是布尔值,但是找到了ing。
例如,
如果我们尝试将数字转换为大写,如下所示:

const num = 123
num.toUpperCase()

将抛出一个 TypeError

num.toUpperCase()^
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

decodeURI("%")
^
URIError: URI malformed

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

如果对URI进行编码或解码有问题,则会引发URIError。

6.EvalError
在使用全局eval()函数时,此函数用于识别错误。
根据EcmaSpec 2018版:
此规范当前未使用此异常。 保留该对象是为了与本规范的先前版本兼容。
7.InternalError 内部错误
该错误在JS引擎内部发生,特别是当它有太多数据要处理并且堆栈增长超过其关键限制时。
当JS引擎被太多的递归,太多的切换情况等淹没时,就会发生这种情况

switch(num) {case 1:...breakcase 2:...breakcase 3:...breakcase 4:...breakcase 5:...breakcase 6:...breakcase 7:...break... up to 1000 cases}

太多的递归,一个简单的例子是这样的:

function foo() {foo()
}
foo()

总结
正如我们所说,没有人能避免犯错误。 就我们键入代码而言,这是一个稳定的事件。 为了克服它,我们需要知道可以抛出的本机错误的类型。 我们在这篇文章中列出了它们,并提供了一些示例来说明它们是如何遇到的。
因此,无论何时在终端或浏览器中引发错误,您现在都可以轻松发现错误发生的位置和方式,并编写更好,更不易出错的代码。
如果您对此有任何疑问或我应添加,更正或删除的任何内容,请随时发表评论。
非常感谢!
请你喝杯

「译文」你必须掌握的 7 种 JavaScript 错误类型相关推荐

  1. 详解 Chrome 「V8 」引擎,让你更懂JavaScript !

    今天来聊聊 V8,它的主要职责是用来执行 JavaScript 代码的.在正式全面了解 V8 之前,先来了解下「JavaScript 的基本特性和设计思想」. 1.JavaScript 的基本特性和设 ...

  2. getallheaders函数在服务器报500错误_「干货」服务器性能优化的8种常用方法

    1.使用内存数据库 内存数据库,其实就是将数据放在内存中直接操作的数据库.相对于磁盘,内存的数据读写速度要高出几个数量级,将数据保存在内存中相比从磁盘上访问能够极大地提高应用的性能.内存数据库抛弃了磁 ...

  3. AI突破的「阴暗面」:怎样防止GPT-3跟人类学坏?

    原文:IEEE Spectrum 编译:梦佳 近期,大规模语言模型频频出现在公众视野中. 前有Google发布首个万亿级模型 Switch Transformer,参数量达到1.6万亿,速度是Goog ...

  4. 「鸡娃」是家长无处安放的「应试」焦虑

    「鸡娃」,很火的网络名词,意思是在「虎妈狼爸」的培养下,给孩子不停地打鸡血,望子成龙,为了让孩子多读书.读好书,不断地给孩子安排补习班兴趣班,不停地让孩子去拼,灌输「爱拼才会赢」的思想. 与「鸡娃」类 ...

  5. 特斯拉大半夜「见鬼」!空无一人的路上,它却看见「幽灵」秒刹车

    金磊 贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 讲个「鬼故事」: 夜深人静,一辆特斯拉Model X在空无一人的公路上行驶着. 瞬间!它看到了「人类看不见的东西」,于是便刹车在路上 ...

  6. 「影视+社交」,网易云信助力「微光」开辟新赛道

    2018年,资本涌入社交领域,社交风口出现.进入2019年,社交领域竞争态势更是愈演愈烈,主打视频社交的「多闪」,主打陌生人社交的「马桶MT」以及「子弹短信」升级而来的「聊天宝」于近期在同日内发布,似 ...

  7. 怎样对流媒体进行压力测试_对node工程进行压力测试与性能分析「干货」

    作者:小黎 转发链接:https://mp.weixin.qq.com/s/WBe7ZLoqFD9UqNusnv_IDA 前言 在系统上线前,为了看下系统能承受多大的并发和并发下的负载情况,常常会先进 ...

  8. 鸿蒙 微内核 什么意思,鸿蒙系统所说的「微内核」,具体是什么?

    自进入大众视野以来,华为就一直宣称自家的鸿蒙操作系统(鸿蒙OS)是基于「微内核」设计的,那么,究竟什么是「微内核」呢? 微内核的英语是Microkernel(或者μ-kernel),在计算机科学中,顾 ...

  9. 当 AI 掌握「读心术」:DeepMind AI 已经学会相互理解

    有时候,我们会觉得 Siri 或 Alexa 等数字助理非常令人失望,因为它们根本不懂我们人类.它们需要懂点被心理学家称为「心智理论」(theory of mind)的东西,搞清楚别人的信念和意图.最 ...

最新文章

  1. CISSP的成长之路(二):为什么要获得CISSP认证
  2. cmenu 隐藏子项中的一个子项_QML中的模型-视图-代理
  3. 提高 webpack 构建 Vue 项目的速度
  4. WebBrowser!
  5. Django---admin
  6. 小学计算机教师交流计划,2023年小学计算机教师工作计划
  7. mac json工具_工具类封装的思路 | 钉钉群机器人为例
  8. 【clickhouse】Port 9000 is for clickhouse-client program
  9. 程序员出差是去干什么_为什么女生不适合做程序员?原来互联网公司女生少,是由于这几点...
  10. Principles of Reactive Programming 之Actors are Distributed (3)
  11. RAID卡的安装配置
  12. python跟我学_灞桥区跟我学python
  13. 猴子都能懂的数据库范式详解
  14. M1 Repast Simphony打不开 无反应问题解决
  15. Word空格自动加下划线
  16. 计算机思维考试题,10道思维水平测试题
  17. 2021 App上架到 各应用商店(应用宝,华为,vivo,小米,AppStore)
  18. 详解机器学习中的梯度消失、爆炸原因及其解决方法
  19. ”故乡飘已远,往意浩无边“
  20. 今天是2019年最后一天,全球金融危机,离我们已经过去十年了

热门文章

  1. java 正则 实例_Java正则表达式示例
  2. 如何使用敏捷开发来赢得太阳能竞速赛
  3. Centos 6.2 单网卡安装pptpd 经验
  4. vue.js嵌套路由-------由浅入深
  5. STL_算法_元素计数(count、count_if)
  6. 《SolidWorks 2017中文版机械设计从入门到精通)》——1.3 常用工具命令
  7. python单/双下划线使用
  8. 使用Profiler Blocked Process Report Alert 监控数据库Blocking
  9. mysql创建用户和远程登录授权
  10. spring框架入门day02