4. 语法专题
4.1 数据类型转换
运算符对数据类型是有要求的。如果运算符发现,运算子的类型与预期不符,就会自动转换类型。
'4' - '3' // 1
4.1.1 强制转换
1. Number()
- 原始类型值
Number函数将字符串转为数值,要比parseInt函数严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN。parseInt逐个解析字符,而Number函数整体转换字符串的类型
parseInt('42 cats') // 42
Number('42 cats') // NaN
2. String()
String方法的参数如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式。String方法背后的转换规则,与Number方法基本相同,只是互换了valueOf方法和toString方法的执行顺序。
3. 自动转换
自动转换的规则是这样的:预期什么类型的值,就调用该类型的转换函数。比如,某个位置预期为字符串,就调用String()函数进行转换。如果该位置既可以是字符串,也可能是数值,那么默认转为数值。
4.2 错误处理机制
- SyntaxError: 解析代码时发生的语法错误。
var 1a;
// Uncaught SyntaxError: Invalid or unexpected token
// 缺少括号
console.log 'hello');
// Uncaught SyntaxError: Unexpected string
- RangeError: 一个值超出有效范围时发生的错误,一是数组长度为负数,二是Number对象的方法参数超出范围,以及函数堆栈超过最大值。
- TypeError: 变量或者参数不是预期类型时发生的错误。
new 123
// Uncaught TypeError: 123 is not a constructor
var obj = {};
obj.unknownMethod()
// Uncaught TypeError: obj.unknownMethod is not a function
4.2.1 throw语句
throw语句的作用是手动中断程序执行,抛出一个错误。
var x = -1;
if (x <= 0) {
throw new Error('x 必须为正数');
}
4.2.2 try...catch 结构
一旦发生错误,程序就中止执行了。JavaScript 提供了try...catch结构,允许对错误进行处理,选择是否往下执行。
try {
throw new Error('出错了!');
} catch (e) {
console.log(e.name + ": " + e.message);
console.log(e.stack);
}
// Error: 出错了!
// at <anonymous>:3:9
// ...
上面代码中,try代码块抛出错误(上例用的是throw语句),JavaScript 引擎就立即把代码的执行,转到catch代码块,或者说错误被catch代码块捕获了。catch接受一个参数,表示try代码块抛出的值。
4.2.3 finally 代码块
try...catch结构允许在最后添加一个finally代码块,表示不管是否出现错误,都必需在最后运行的语句。
function cleansUp() {
try {
throw new Error('出错了……');
console.log('此行不会执行');
} finally {
console.log('完成清理工作');
}
}
cleansUp()
// 完成清理工作
// Uncaught Error: 出错了……
// at cleansUp (<anonymous>:3:11)
// at <anonymous>:10:1