HTML5 脚本

对于HTML5来说,引入了一些新事件以及媒体元素,其中的主要内容有:

  1. 跨文档消息传递
  2. 原生拖放
  3. 媒体元素
  4. 历史状态管理

这部分的内容里媒体元素比较重要,待单独学习了妙味课堂的HTML5新属性再回头来整理该部分内容,先有所了解即可。

错误处理

对于用户来说,现代浏览器一般不会像早期的IE一样弹出脚本错误,而是将所有错误信息都显示在开发工具的控制台中。页面内的由脚本操作的内容能正常显示就显示,显示不了就不显示,不会给用户造成困扰。

使用try-catch捕获错误并进行处理

这是JS里捕获错误并且处理的语句,其完整格式如下:

try {
    可能会导致错误的代码
}
catch(error) {
    在错误发生时执行的代码
}
finally {
    无论如何都会执行的代码
}

try内的语句如果遇到错误,就会立刻停止执行,然后会将一个错误对象传递给catch语句。

catch语句必须加一个括号,其内部必须起一个名字,不能匿名。这个名字就是指向错误对象的变量。这个错误对象被所有浏览器支持的属性就是 error.message 即错误信息。

如果添加了finally子句,则即使try和catch代码块中包含return 或者其他跳转语句,都会被忽略,finally子句中的内容一定会被执行。

错误类型

错误类型及解说
错误类型 说明
Error 错误的基类,一般不会被直接抛出。该类型主要是为开发人员编写自定义错误继承之用
EvalError 这个错误主要是eval()函数发生错误的时候被抛出。实际开发中应当不使用eval()函数,所以该错误如果出现,需要检查。
RangeError 一般在数组索引超出下标范围时触发。
ReferenceError 一般在找不到对象的时候触发,比如访问不存在的变量。
SyntaxError 一般把语法错误的字符串传给eval()函数就会发生此错误。如果是JS程序中发生该错误,程序会运行失败。
TypeError 导致该错误的具体原因很多,但归根结底还是变量的类型不符合要求所致。
URIError 在使用 encodeURI()decodeURI()时候如果出错,就抛出此错误,这种错误很少见,因为这两个函数的容错性很高。

一般最常发生的错误是TypeError, RangeError 和 ReferenceError

如果错误未经处理,像Chrome会在控制台内提示uncaught 未捕捉。如果被try-catch处理,那么该错误不会反应到浏览器中。try-catch最好是用来处理无法控制的错误,比如使用第三方库的错误等。

throw抛出错误

throw实际上是一个操作符,后边可以指定任何的值都可以,JS执行到throw就会立刻停止然后将这个值当做错误抛出,try-catch可以捕获错误并且接受这个值。

但最常用的还是抛出标准错误或者自定义错误类型:

try{
    throw new Error("intended error");
}
catch(error){
    console.log(error.message);
}

这样就抛出了一个自定义错误信息的Error类型错误。不过在Webstorm中对于这么编写是有提示的,也就是用throw当成了控制分支的条件,所以不要在try语句块里故意throw错误。

还可以通过原型链继承来自定义错误类型,必须指定两个属性name和message即可。

Error 事件

任何没有通过try-catch的错误,都会在window对象上触发error事件,这是所有浏览器都支持的事件。要指定error事件的处理机制,不能采取DOM 2级使用.addEventListner的方法,必须使用老式的指定方法:

window.onerror = function (message,url,line) {
    console.log(message);
    console.log(url);
    console.log(line);
    return false;
};

这个事件处理程序可以接收三个参数,分别是错误信息,页面URL和行号,其实只有错误信息有用,另外两个信息未必准确。

末尾加上 return false;可以阻止浏览器报告错误,但也仅在部分浏览器有用。

调试和记录错误

经常使用的 console.log()还有一系列兄弟方法,用于记录各种不同的信息。

  1. console.error(message) 将错误信息发送到控制台
  2. console.info(message) 将信息性消息发送到控制台
  3. console.log(message) 将一般消息发送到控制台
  4. console.warn(message) 将警告消息发送到控制台

这几个方法可以发送任意内容,会导致控制台显示消息时候的样式不同,比如Chrom中info和log都是普通显示,而warn前边会带一个三角叹号标记,错误信息前边则是一个红色叉。

JSON

现在在JS里,而不是其他语言里学习JSON,感觉就像得到真传。

JSON的名称是JavaScript Object Notation的缩写,翻译成JS对象表示法。顾名思义,就是用JS表示对象的一种方式来做成字符串,用来传递数据。在互联网早期,XML是互联网上数据传递的事实标准。在2006年之后,JSON逐渐成为传递数据和不同的编程语言之间进行数据交换的主要格式。因此JSON虽然来源于JS,但已经被几乎所有编程语言支持,成为了目前事实上的互联网交互数据的标准。

JSON是一种字符串数据格式,只要用标准的写法和Unicode进行编码,不同的编程语言都可以将JSON字符串与该编程语言的某些数据类型进行互相转换。

JSON 格式

JSON可以表示三种类型的值:

  1. 简单值,使用与JS相同的语法,可以表示字符串,数值,布尔值和null,无法表示undefined
  2. 对象,用花括号括起来的键值对,键和值如果是字符串,都必须用双引号。值可以是简单值,对象或者数组
  3. 数组,数组的值也可以是简单值,对象或者数组。

具体每种值会变成什么样子,可以通过解析与序列化来看一看

解析与序列化

JSON本身是一个字符串,所谓解析,就是通过这个字符串,生成JS中的各种数据类型。而序列化,就是把JS中的上述数据类型,转换成JSON字符串。

ES5定义了全局对象JSON,JSON对象有两个方法,分别用于序列化和解析:

  1. .stringify(object, filter, indent)第一个参数是需要序列化的对象;第二个参数是一个过滤器,过滤器可以是函数也可以是数组;第三个参数是缩进,可以是1-10的数值,也可以是字符串。

    第一个参数是需要序列化的对象;第二个参数是一个过滤器,过滤器可以是函数也可以是数组;第三个参数是缩进,可以是1-10的数值,也可以是字符串。

    默认情况下,第二个和第三个参数可以不传,生成的JSON字符串不会包含任何空格字符和缩进。

    序列化时,所有的函数和原型成员都会被忽略,值为undefined的属性也会被忽略,结果中全部都是JSON支持的数据类型。所以JSON只能用来传递上述的数据,而不能传递函数和程序代码。

    第二个参数如果是数组,序列化结果将只包含数组中列出的属性。如果是函数,这个函数需要接受key 和 value两个参数,然后针对key=其中某个属性的时候,对value进行操作返回想要的value,来控制最终的结果。这个函数必须有返回值。

    第三个参数如果是数值,表示每行开头的缩进;如果是字符串,就用字符串放在每行前作为缩进。

  2. .parse(JSON, reviver)这个方法用于解析JSON字符串,返回JSON字符串解析后的结果,是简单值,对象或者数组类型。

    第二个参数叫做还原函数,实际上与序列化时候的过滤器类似,也是接受key 和 value 两个参数,对自己想要操作的key的value进行操作得到实际解析出来的value,也必须要返回值。

此外JS中原生的Date对象还有一个.toJSON()方法,用于将Date对象转换成ISO8601标准的字符串。

在Web开发中,除了在JS中使用JSON之外,还需要注意后端语言中解析JSON字符串后对应的数据类型,这样才能有效的进行前后端通信。