阮一峰JS三轮复习——第三天

506 阅读2分钟

4. 语法专题

4.1 数据类型转换

运算符对数据类型是有要求的。如果运算符发现,运算子的类型与预期不符,就会自动转换类型。

'4' - '3' // 1

4.1.1 强制转换

1. Number()

  1. 原始类型值

Number函数将字符串转为数值,要比parseInt函数严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN。parseInt逐个解析字符,而Number函数整体转换字符串的类型

parseInt('42 cats') // 42
Number('42 cats') // NaN

2. String()

String方法的参数如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式。String方法背后的转换规则,与Number方法基本相同,只是互换了valueOf方法和toString方法的执行顺序。

3. 自动转换

自动转换的规则是这样的:预期什么类型的值,就调用该类型的转换函数。比如,某个位置预期为字符串,就调用String()函数进行转换。如果该位置既可以是字符串,也可能是数值,那么默认转为数值。

4.2 错误处理机制

  1. SyntaxError: 解析代码时发生的语法错误。
var 1a;
// Uncaught SyntaxError: Invalid or unexpected token

// 缺少括号
console.log 'hello');
// Uncaught SyntaxError: Unexpected string
  1. RangeError: 一个值超出有效范围时发生的错误,一是数组长度为负数,二是Number对象的方法参数超出范围,以及函数堆栈超过最大值。
  2. 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