前端常见七种报错类型及解决方案
目录
一、前端常见报错类型
代码错误
语法错误(SyntaxError ):
引用错误(ReferenceError):
类型错误(TypeError):
范围错误(RangeError):
URLError(URL 错误):
EvalError(eval 错误):
Error(基类型):
逻辑错误
二、解决方案
针对代码错误
针对逻辑错误
一、前端常见报错类型
错误类型分两种,一种是代码错误,这种错误会在浏览器console面板显示具体错误,可以根据浏览器提供的相关信息去排查;另一种是逻辑错误,这种浏览器不会报错,可以通过断点或打日志排查。
-
代码错误
-
SyntaxError (语法错误):
- 定义:解析代码时发生的语法错误,即代码不符合 JavaScript 编码规则,整个代码都不会执行 。浏览器报错信息通常为 “Uncaught SyntaxError: 相关信息提示” 。
- 示例:变量声明错误(如
vara = 1;
正确应为var a = 1;
)、缺少括号等。 - 原因:不熟悉 JavaScript 语法规则,例如变量命名不符合要求(变量由字母、数字、下划线、$ 符号组成,不能以数字开头,不能是关键字和保留字,如
for
、while
、this
等 ,且区分大小写 );书写时遗漏必要符号。
-
ReferenceError(引用错误):
- 定义:引用了一个不存在的变量或对象属性时触发的错误。报错信息类似 “Uncaught ReferenceError: xxx is not defined” ,其中
xxx
是未定义的变量名。 - 示例:
console.log(a);
,这里 a未声明。 - 原因:变量未声明就使用;或者在作用域链中无法找到该变量。
- 定义:引用了一个不存在的变量或对象属性时触发的错误。报错信息类似 “Uncaught ReferenceError: xxx is not defined” ,其中
-
TypeError(类型错误):
- 定义:操作或引用的变量类型不符合预期时出现的错误 。报错如 “Uncaught TypeError: xxx is not a function” (调用了非函数类型的值作为函数 ) 或 “Uncaught TypeError: Cannot read property 'xxx' of null” (试图读取
null
或undefined
对象的属性 )。 - 示例:
var a = new 123;
对字符串、布尔值、数值等原始类型的值使用new命令,就会抛出这种错误,因为new命令的参数应该是一个构造函数。 - 原因:对变量类型判断失误,在不合适的类型上执行特定操作。
- 定义:操作或引用的变量类型不符合预期时出现的错误 。报错如 “Uncaught TypeError: xxx is not a function” (调用了非函数类型的值作为函数 ) 或 “Uncaught TypeError: Cannot read property 'xxx' of null” (试图读取
-
RangeError(范围错误):
- 定义:当一个值超出了其有效范围时触发。例如,数组长度设置为负数,或者
Math.pow()
方法传入过大的参数等。报错信息如 “Uncaught RangeError: 相关范围错误提示” 。 - 示例:
var a = new Array(-1);
,创建长度为负数的数组。 - 原因:对方法参数取值范围不熟悉,或者计算结果超出预期范围
- 定义:当一个值超出了其有效范围时触发。例如,数组长度设置为负数,或者
-
URLError(URL 错误):
- 定义:当使用与 URI 相关的函数(如
decodeURI()
、encodeURI()
等 ),传入的参数不符合正确的 URI 格式时,就会抛出 URLError 错误。主要涉及到对统一资源标识符(URI)进行编码、解码等操作时出现的问题。 - 示例:
- 原因:对 URI 相关函数的参数格式不熟悉,或者在处理从外部获取(如用户输入、网络请求返回 )的 URI 数据时,没有进行有效的格式校验,导致传入了非法的 URI 字符串。
- 定义:当使用与 URI 相关的函数(如
-
EvalError(eval 错误):
- 定义:
eval()
函数是 JavaScript 中用于计算字符串并执行其中 JavaScript 代码的函数。当eval()
函数的使用不符合预期,比如在非严格模式下对某些特殊情况的处理,或者尝试执行语法错误的代码字符串时,就可能抛出 EvalError 错误。不过在现代 JavaScript 开发中,由于更推荐使用其他安全的代码执行方式(如函数封装等 ),直接使用eval()
函数的场景已经很少,所以这种错误也不常见。 - 示例:
eval('not a valid javascript code'); // 这里传入的字符串不是合法的 JavaScript 代码
。 - 原因:对
eval()
函数的使用场景和限制理解不足,随意将不可信或语法错误的字符串传递给eval()
函数。另外,在严格模式下,eval()
函数的行为受到更多限制,使用不当也容易引发错误
- 定义:
-
Error(基类型):
- 定义:Error 是 JavaScript 中所有错误类型的基类,其他六种错误类型(SyntaxError、ReferenceError、TypeError、RangeError、URIError、EvalError )都继承自它。主要用于开发者在代码中手动抛出自定义错误,以便更好地控制和处理程序运行过程中的异常情况 。
- 示例:
- 原因:开发者在特定业务逻辑下,想要明确标识某个不符合预期的情况为错误,并进行统一的错误处理时,会使用 Error 基类来创建自定义错误对象,比如在验证用户输入、检查函数参数合法性等场景中 。
-
-
逻辑错误
- 逻辑错误:
- 定义:代码语法正确,浏览器不会报错,但程序运行结果不符合预期。这类错误需要通过打印日志(如
console.log()
)或者打断点进行调试排查。 - 示例:在循环中条件判断错误,导致循环次数不对;或者在算法逻辑中,计算顺序或条件判断有误,使结果错误。比如计算
1 + 2 + 3 +... + 10
,循环条件设置错误导致计算结果不对。 - 原因:算法设计不合理、对业务逻辑理解有误、条件判断或流程控制写错等。
- 定义:代码语法正确,浏览器不会报错,但程序运行结果不符合预期。这类错误需要通过打印日志(如
- 逻辑错误:
二、解决方案
-
针对代码错误
- 语法错误:仔细检查报错行及附近代码,对照 JavaScript 语法规则,查看是否有拼写错误、符号遗漏或多余、变量命名不当等问题。可以借助代码编辑器的语法高亮和错误提示功能辅助排查。
- 引用错误:确认报错中提到的变量是否已声明,若未声明则添加声明;检查变量作用域,确保在使用变量的地方能正确访问到它。比如检查函数内部变量是否在合适作用域内声明。
- 类型错误:在操作变量前,使用
typeof
等方法判断变量类型,确保操作与变量类型匹配。如果是读取对象属性报错,先判断对象是否为null
或undefined
,可以使用if (obj)
等条件判断来避免错误。 - 范围错误:检查涉及范围的操作(如数组长度设置、函数参数取值等 ),确认参数值在有效范围内。对于有取值范围要求的方法,查阅文档明确范围并正确设置参数。
- URLError:在使用
decodeURI()
、encodeURI()
等函数前,先对传入的参数进行合法性校验。可以编写自定义函数,根据 URI 的语法规则(如字符的合法范围、编码格式等 )来检查参数。如果是用户输入的 URI 数据,要做好输入提示和格式限制,引导用户输入正确格式的 URI。 - EvalError:尽量避免使用
eval()
函数,能用其他方式(如函数封装逻辑、使用 JavaScript 内置对象和方法 )实现功能的,就不要用eval()
。如果必须使用eval()
,要确保传入的字符串是经过严格校验、来源可信且语法正确的 JavaScript 代码。可以先对字符串进行语法检查(比如借助一些 JavaScript 语法解析库 ),再传递给eval()
函数。
-
针对逻辑错误
- 使用
console.log()
打印日志:在关键代码位置插入console.log()
语句,输出变量值、函数执行结果等信息,通过查看控制台输出,分析程序执行过程和数据变化,找出逻辑错误点。 - 利用浏览器调试工具打断点:在浏览器开发者工具的 “Sources” 面板中,找到对应的 JavaScript 文件,在可疑代码行设置断点。运行代码,程序执行到断点处会暂停,此时可以查看变量的值、调用栈等信息,逐步分析代码执行逻辑,定位错误。
- 使用