一、数据类型的转换
-
概述
JavaScript是一种动态语言,变量没有类型限制,可以随时赋予任意值
-
强制转换:主要是值
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(123) // "123" String('abc') // "abc" String(true) // "true" String(undefined) // "undefined" String(null) // "null"
对象的转化:如果
String
参数是对象,返回一个类型的字符串,如果是数组,返回数组的字符串形式String({a: 1}) // "[object Object]" String([1, 2, 3]) // "1,2,3" /* String的转换规则 先调用对象自身的toString方法。如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。 如果toString方法返回的是对象,再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值,则对该值使用String函数,不再进行以下步骤。 如果valueOf方法返回的是对象,就报错。 */
Boolean
函数可以将任意类型的值转为布尔值将
undefined
,null
,0
,NAN
,""
转换为false
,其他的值全是true
.三种情况时,JavaScript会自动转换数据类型。
-
不同类型的数据互相运算
123 + "abc"; // 123abc
-
对非布尔值类型的数据求布尔值
if ('abc') { console.log('hello') } // "hello"
-
对非数值类型的值,使用
+
,-
+ {foo: 'bar'} // NaN - [1, 2, 3] // NaN
二、错误处理机制
-
Error实例对象:JavaScript解析代码,一旦发送错误,就会抛出一个错误对象。
var err = new Error("出错了"); err.message; // 出错了
-
原生错误类型
SyntaError
对象:解析代码时发送的语法错误ReferenceError
对象:引用一个不存在的变量时发生的错误RangeError
对象:一个值超出有效返回时发送的错误TypeError
对象:变量或者参数不是预期类型时发送的错误URLError
对象:是URL相关函数的参数不正确时抛出的错误EvalError
对象:eval
函数没有被正确执行时,会抛出EvalError
错误 -
自定义错误
function UserError(message) { this.message = message || '默认信息'; this.name = 'UserError'; } UserError.prototype = new Error(); UserError.prototype.constructor = UserError; new UserError("这是一个自定义错误")
-
throw语句:手动中断程序执行,抛出一个错误
if (x <= 0) { throw new Error('x 必须为正数'); } // throw 它可以抛出任意类型,不单单只是Error对象
-
try...catch结构:用于异常捕捉,防止程序报错,中断
try { throw new Error("错误信息"); } catch(error) { error.message; }
为了捕捉不同类型的错误,
catch
代码块之中可以加入判断语句。try { foo.bar(); } catch (e) { if (e instanceof EvalError) { console.log(e.name + ": " + e.message); } else if (e instanceof RangeError) { console.log(e.name + ": " + e.message); } // ... }
-
finally代码块:不管程序是否出错,都会执行