【亡羊补牢】JS灵魂之问 第24期 修炼内功 JS错误信息类型知多少

引言

有几天没有更新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 放入全局使用了。

最后

文章产出不易,还望各位小伙伴们支持一波!

往期精选:

小狮子前端の笔记仓库

访问超逸の博客,方便小伙伴阅读玩耍~

学如逆水行舟,不进则退

猜你喜欢

转载自blog.csdn.net/weixin_42429718/article/details/108682050
今日推荐