一、数据类型的转化
强制转换
主要指使用Number(), String(), Boolean()三个函数。
Number()
// 数值:转换后还是原来的值
Number(324) // 324
// 字符串:如果可以被解析为数值,则转换为相应的数值
Number('324') // 324
// 字符串:如果不可以被解析为数值,返回 NaN
Number('324abc') // NaN
// 空字符串转为0
Number('') // 0
// 布尔值:true 转成 1,false 转成 0
Number(true) // 1
Number(false) // 0
// undefined:转成 NaN
Number(undefined) // NaN
// null:转成0
Number(null) // 0
// Number 方法如果是对象,除非包含单个数值的数组,否则都返回 NaN
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5
关于对象的 Number() 转换规则:
第一步,调用对象自身的valueOf方法。如果返回原始类型的值,则直接对该值使用Number函数,不再进行后续步骤。
第二步,如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法。如果toString方法返回原始类型的值,则对该值使用Number函数,不再进行后续步骤。
第三步,如果toString方法返回的是对象,就报错。
String()针对原始类型值
-
数值:转为相应的字符串。
-
字符串:转换后还是原来的值。
-
布尔值:true转为字符串"true",false转为字符串"false"。
-
undefined:转为字符串"undefined"。
-
null:转为字符串"null"
针对对象 String方法的参数如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式。
String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"
针对对象,String()方法转换规则:
第一步、先调用对象自身的toString方法。如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。
第二步、如果toString方法返回的是对象,再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值,则对该值使用String函数,不再进行以下步骤。
第三步、如果valueOf方法返回的是对象,就报错。
Boolean()它的转换规则相对简单:除了以下五个值的转换结果为false,其他的值全部为true。
undefinednull-0或+0''空字符串NaN
注意,所有对象,包括空对象转换的结果都是true
Boolean({}) // true
Boolean([]) // true
Boolean(new Boolean(false)) // true
二、错误处理机制
JavaScript 原生提供Error构造函数,所有抛出的错误都是这个构造函数的实例。Error实例对象必须有message属性。
-
message:错误提示信息
-
name:错误名称(非标准属性)
-
stack:错误的堆栈(非标准属性)
let err = new Error('出错了');
err.message // "出错了"
原生错误类型
Error实例对象是一般的错误类型,在他的基础上,JavaScript 还定义了 6 中错误对象。
SyntaxError对象(解析代码时发生的语法错误)ReferenceError对象(引用一个不存在的变量时发生的错误)RangeError对象(一个值超出有效范围时发生的错误,主要有几种情况,一是数组长度为负数,二是Number对象的方法参数超出范围,以及函数堆栈超过最大值)TypeError对象(变量或参数不是与其类型时发生的错误)URIError对象(URI 相关函数的参数不正确时抛出的错误)EvalError对象(eval函数没有被正确执行时抛出错误)
自定义错误
function UserError(message) {
this.message = message || '默认信息';
this.name = 'UserError';
}
UserError.prototype = new Error();
UserError.prototype.constructor = UserError;
new UserError('这是自定义的错误!');
throw 语句
throw语句的作用是手动中断程序执行,抛出一个错误。
tyr...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代码块抛出的值。catch代码块捕获错误之后,程序不会中断,会按照正常流程继续执行下去。
finally代码块
try...catch结构允许在最后添加一个finally代码块,表示不管是否出现错误,都必需在最后运行的语句。
注意:遇到只有try和finally语句的情况。在try代码块中如果出现return语句,或者throw语句。其执行顺序是排在finally代码之前,但是它要等到finally代码执行完毕后才返回。
function idle(x) {
try {
console.log(x);
return 'result';
} finally {
console.log('FINALLY');
}
}
idle('hello')
// hello
// FINALLY
遇到存在try, catch和finally语句的情况,进入catch代码块之后,一遇到throw语句,就会去执行finally代码块,其中有return false语句,因此就直接返回了,不再会回去执行catch代码块剩下的部分了。
function f() {
try {
throw '出错了!';
} catch(e) {
console.log('捕捉到内部错误');
throw e; // 这句原本会等到finally结束再执行
} finally {
return false; // 直接返回
}
}
try {
f();
} catch(e) {
// 此处不会执行
console.log('caught outer "bogus"');
}
// 捕捉到内部错误
三、编程风格
这里就不做介绍了
四、console对象与控制台
console 对象的静态方法
console.log()平时用的比较多,用于在控制台输出信息console.info()是console.log()的别名,用法完全一样console.debug()与console.log方法类似,会在控制台输出调试信息。但是,默认情况下,console.debug输出的信息不会显示,只有在打开显示级别在verbose的情况下,才会显示。console.warn()与log不同之处在于,输出信息时,前面将一个黄色三角,表示警告。console.error()输出信息时,会在前面上一个空色的叉,表示出错
还有其他一些,平时很少用到,这里不做表述