引言
有几天没有更新JS灵魂之问的专栏系列文章了,秋招季,也在忙着备战笔试面试。今天得空再来写一篇文章,本篇要讲解的内容是关于 JS错误信息类型
,那今天这篇看能不能问倒你了,一起来探索一下吧。
仰望星空的人,不应该被嘲笑
JS 错误信息类型
语法错误
1、SyntaxError 语法错误
// 变量名不规范
var 1 = 1;
SyntaxError: Unexpected number
意外的数字
var 1ab = 1;
SyntaxError: Invalid or unexpected token
其中token
指代标记的意思。
// 关键字不可赋值
new = 5;
SyntaxError: Unexpected token '='
// 基本语法错误
var a = 5:
SyntaxError: Unexpected token ':'
引用错误
2、ReferenceError 引用错误、
// 变量或函数未被声明
test();
ReferenceError: test is not defined
console.log(a);
ReferenceError: a is not defined
// 给无法被赋值的对象赋值的时候
var a = 1 = 2;
SyntaxError: Invalid left-hand side in assignment
范围错误
3、RangeError 范围错误
// 数组长度赋值为负数
let arr = [1, 2, 3];
arr.length = -1;
console.log(arr);
RangeError: Invalid array length
// 对象方法参数超出范围
var num = new Number(66.66);
console.log(num.toFixed(-1));
RangeError: toFixed() digits argument must be between 0 and 100
类型错误
4、TypeError 类型错误
// 调用不存在的方法
123();
TypeError: 123 is not a function
var obj = {
};
obj.say();
TypeError: obj.say is not a function
// 实例化原始值
var a = new 'string';
TypeError: "string" is not a constructor
URI 错误
5、URIError URI错误
URI
: uniform resource identifier (统一资源标识符)
URL
:uniform resource locator(统一资源定位符)
URN
:uniform resource name(统一资源名称)
eval 函数执行错误
6、EvalError eval函数执行错误
这个就了解一下好了,在 es3
就不建议使用了。它的性能不太好,也不好调试,同时可能会引起安全性问题xss
攻击(例如 eval
和输入框 input
值相绑定时容易引起 xss
安全性问题 ),另外,可读性也不太好(在字符串中执行)。
eval('var a=1; console.log(a);');
输出结果为 1
。
它神奇的地方在于,它可以将 json
数据转换成对象。
try / catch
try {
console.log('正常执行1');
console.log(a);
console.log('正常执行2');
} catch (error) {
console.log(error.name + ':' + error.message);
}
输出结果如下:
正常执行1
ReferenceError:a is not defined
严格模式
从 ES5
开始有了两种模式,一种是严格模式,一种是正常模式。IE9及以下不支持严格模式
。
'use strict';
为什么要设置字符串,是因为字符串相当于表达式,在浏览器不会报错。并且书写的位置必须在最上面一行。
补充知识点:with()
语法就是括号里面填入哪个对象,就会找到对应作用域,也就是作用域链会被改变(严格模式下不能使用)
另外,arguments
下大部分属性严格模式不能使用,例如之前提到的 callee / caller
,但是 arguments
可以使用。
其次,严格模式下这种代码也会报错,说 b
没有声明:
'use strict';
var a = b = 1;
那我们看看下面会输出什么,是 1
嘛?
function test(){
console.log(this);
}
test.call(1);
结果如下,会打印包装类 Number
,因为 this
会指向对象,所以会进行一次包装。而在严格模式下就会输出 1
。
继续,再看看这份代码在 es5
严格模式下会输出什么?
'use strict';
var obj = {
a: 1,
a: 2
}
console.log(obj.a);
答案是 2
,这个比较特殊,严格模式下不报错。
补充:在 es5
严格模式下,函数的参数名不能重复。
继续,再看看这份代码在 es5
严格模式下会输出什么?
'use strict';
eval('var a=1; console.log(a);');
console.log(a);
答案是 1 报错
,因为严格模式下 eval
有自己独立作用域,不会将 var a
放入全局使用了。
最后
文章产出不易,还望各位小伙伴们支持一波!
往期精选:
访问超逸の博客,方便小伙伴阅读玩耍~
学如逆水行舟,不进则退