1、SyntaxError语法错误
(1)变量名不规范
var 1 = 1 // => unexpected number
var 1ab = 1 // => invalid or unexpected token 无效或者意外的标记
(2)关键字不可赋值
new = 1 // => unexpeted token
(3)基本语法错误
var num = 5: // => unexpected token :
2、Reference Error 引用错误
(1)引用未定义的变量 test() // => reference error test is not defined
(2)给无法赋值的变量赋值 1 = 2 // => invalid left-hand side in assignment
3,、RangeError 范围错误
(1)数组长度赋值为负数
var arr = [];
arr.legnth = -1 // => invalid array length
(2)对象方法参数,超出范围
var num = 23.56
num.toFixed(-1) // => digits argument must be between 0 and 100
4、TypeError
(1)引用不存在的方法
var a = {}
a.test() // => typeerror a.test is not a function
(2)实例化原始值的时候,new后面没有跟构造函数
var num = new ‘Number’ // => ‘Number’ is not a constructor
5、UrlError
URI > URL + RUN
URI : uniform resource identifier 统一资源标志符
URL: uniform resource location 统一资源定位符 网上资源唯一的地址
URN: uniform resource name 统一资源名称 网上资源的名称
var myUrl = ‘www.baidu.com?search=学习资源’
console.log(encodeURI(myUrl))
var myUrl = ‘%qerqr%’
console.log(decodeURI(myUrl)) // => UrlError malformed
6、EvalError,eval使用时报错
执行eval时不用引号扩住参数,现在不会报错了
eval作用:将字符串转化成js代码执行。可用于将后台的json字符串转化为js对象(现在有JSON.parse)
eval的弊端:语法规范不好,有被恶意利用的危险,执行更慢(调用js执行器),调试不便。
以上六点都有相关内置构造函数
7、try-catch
一般情况下浏览器报错了,程序立马停止执行。这时可以用到try-catch,用来捕获可能的错误,并进行下一步处理,避免程序的终止。
let json = '';
try{
if(json === ''){
throw('json为空')
//放在try里面手动抛出错误信息,将抛出的异常传递给下面第一个catch块
}
JSON.parse(json)
}catch(e){
console.log(e.name + ':' + e.message)
}finally{
//无论有没有捕获到错误,都会执行和放在外部作用一样
}
8、ECMA历史
97 - 1.0
98 - 2.0
99 - 3.0 (javascript的通行标准)
07 - 4.0草案,设计很激进,不受浏览器厂商待见,只有mozzila支持
08 - 4.0草案中止。在3.0基础上,加上容易改善的部分形成3.1-ECMAScript-5.0。剩下激进的部分被称作harmony。
09 - 5.0发布。harmony中一部分不是特别激进的部分被称作js.next(es6部分) ,另一部分被称为js.next.next(后来被作为es7部分)
11 - 5.1作为ISO国际标准发布
15 es6 = js.next正式发布, ECMAScript2015
9、严格模式
es5中有正常模式,严格模式
ie9及以下版本不支持严格模式
3.0有不足和一些怪异行为,es5对效率有很高要求,为了对以后发展作铺垫,加上了严格模式。有些3.0的代码在正常模式下正常执行,在严格模式下会报错。
‘use strict’, 不支持的浏览器遇见字符串表达式不会报错。
一般推荐在函数内部使用严格模式。
严格模式下
(1)不允许使用with函数(改变作用域链,消耗性能,直接在参数对象上查找属性和方法),会报错。
(2)caller-callee不可用,会报错,arguments可用。
(3)直接给未声明的变量赋值,会直接报错。
var a = b = 1
(4) this不会默认指向window,未赋值,就是undefined
(5)函数参数名不能重名,会报错。
(6)对象属性名重复,不会报错取后面的值
'use strict'
let obj ={
a:1,
a:2
}
console.log(obj.a) // => 2
(7)eval在严格模式下,有自己的作用域。直接在外面访问变量会报错。