JS从0开始(十八)JS的6种错误信息类型、 try_catch、严格模式

143 阅读5分钟

一. JS错误信息类型

1.语法错误 SyntaxError

①变量名不规范

var 1 = 2;
var 1ab =1;

②关键字赋值

new = 5;

③基本的语法错误

var a = 5:      后面的符号为冒号或中文的 ;等

2.引用错误 ReferenceError

①变量或者函数未被声明

② 给无法被赋值的对象赋值

var a = 1 = 2
var a = 1      console.log(a) = 1

3. 范围错误 RangeError

①数组长度赋值为负数

②对象方法参数超出可行范围

var num = new Number(66.66); //化为数字类型66.66
console.log(num.toFixed(1));     / 66.7
console.log(num.toFixed(-1));    /Uncaught RangeError:
                 /toFixed() digitsargument must be between 0 and 100 at Number.toFixed

4.类型错误 TypeError

① 调用不存在的方法

var obj = {};
obj.say; //不报错
obj.say // TypeError: obj.say is not a function

②实例化原始值

new 后面不跟函数名
var obj = new 123; // Uncaught TypeError: 123 is not a constructor

5. URI错误: URIError

URI: UNIFORM RESOURCE Indentifier 统一资源标识符

URL: UNIFORM RESOURCE Locator 统一资源定位符: 通过URL可以访问到特定的页面

URN: UNIFORM RESOURCE NAME 统一资源名称: 资源的唯一标识: space.bilibili.com/319485717?

var myUrl = 'https://space.bilibili.com/319485717?起飞'
var newUrl = encodeURI(myUrl);
console.log(newUrl);

var newNewUrl = decodeURI(newUrl);
console.log(newNewUrl);

encodeURI()可以将网址中中文转为字符编码
decodeURI(newUrl);可以将字符编码转回中文
这些都是JS中内置方法

var str = decodeURI('%sdasdds%'); / URI malformed  at decodeURI

decodeURI、encodeURI()等括号中字符不对会造成 URIError

6. eval函数执行错误: EvalError

1.eval函数能执行括号里面的程序:eval('var a =1 ; console.log(a) ' ); 里面的字符串程序能执行,输出1
2.JSON对象里面不能嵌有方法:
3.用eval()能将里面的JSON字符串数据转化为对象

  var jsonData = '[' + '{' + ' "name" : "abc" ' + '}' + ']';
 console.log(jsonData); /输出[{ "name" : "abc" }]

 var data = eval('(' + jsonData + ')');
 console.log(data);  /输出0: {name: "abc"}
                     /length: 1
                     /__proto__: Array(0)

4.eval()的缺点: 从ES3开始就不推荐使用
写法规范性不好(不加引号也能执行)、不好调试、性能问题、容易引起XSS攻击

7. 人为抛出错误

调试时出现以上6种情况称为系统的抛出错误,而上面6种错误也可以人为的抛出

var error = new SyntaxError('代码错误了')
console.log(error);

即人为的实例化错误,主动的去抛出错误;
程序出错在意料之内时,可以主动去抛出错误

二.手动抛出错误的方法: try_catch

  try{
  /throw 'throw必须放到第一行才会抛出' 
 console.log('正常执行1');
 console.log(a);         /中间出现错误,只执行第一句
 console.log('正常执行2');

}catch(e){
console.log(e);     /ReferenceError: a is not defined ,它的作用就是捕获try里面的错误
                   /try里面没有错误,就不执行
console.log(e.name + ':' + e.message); /ReferenceError:a is not defined
                              /e.name:错误名称, e.message:错误信息
}finally{
  console.log('正常执行4');  /不管try里面有错没错都会执行
                       /以后写程序时可能会出错的放到try里面,一定要执行的放到finnaly里面
}

思路总结

1.catch(e)的作用就是捕获try里面的错误,try里面没有错误,就不执行
2.不管try里面有错没错finally里面都会执行,以后写程序时可能会出错的放到try里面,一定要执行的放到finnaly里面
3.throw:自定义抛出的错误信息,必须放到第一行才会有效果,同时在第一行时不管后面语句的对错, 都只会输出throw里面的语句,后面的try语句都不会执行了

三. 严格模式

参考网址:(www.runoob.com/js/js-stric…)

从ES5开始运行方式有两种: 正常模式、严格模式
JavaScript 严格模式(strict mode)即在严格的条件下运行。
IE9及以下的IE浏览器不支持严格模式
严格模式其实是历史遗留问题: ES3时很多怪异语法、行为,安全性也不行

2.为什么使用严格模式:

1.消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
2.消除代码运行的一些不安全之处,保证代码运行的安全;
3.提高编译器效率,增加运行速度;
4.为未来新版本的Javascript做好铺垫。

"严格模式"体现了Javascript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。

另一方面,同样的代码,在"严格模式"中,可能会有不一样的运行结果;一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行甚至报错

3.进入严格模式

在程序里面写 'use strict' 进入严格模式,一般在函数里面/模块里面写,这样不会影响全局。

4.严格模式的限制

1.变量必须得声明
2.函数内部的this必须赋值,否则返回undefined
this的赋值必须通过call来赋值:

 'use strict'
function test() {
 console.log(this); 
}
test();    /undefined
test.call(1); / 1

3.函数的形参不能重复

 'use strict'
function test(a, a){
  console.log(a);    /出现错误
}
test(1,2);
  1. 对象的属性名(键名)不允许重复, 虽然不会报错,但是不允许
 'use strict'
var obj ={
  a: 1,
  a: 2
 }
 console.log(obj.2);  /输出2

5. 在严格模式下eval()不再是全局的,它有自己的作用域了

 'use strict'
eval('var a = 1, console.log(a)') /输出1
console.log(a);              /报错

6. 不能调用caller、callee
caller、callee等arguments的大部分属性方法不能用,但是arguments本身可以用
参考网址:(www.runoob.com/js/js-stric…)