一、数据类型的转化
强制转换
主要指使用Number()
, String()
, Boolean()
三个函数。
Number()
// 数值:转换后还是原来的值Number(324) // 324// 字符串:如果可以被解析为数值,则转换为相应的数值Number('324') // 324// 字符串:如果不可以被解析为数值,返回 NaNNumber('324abc') // NaN// 空字符串转为0Number('') // 0// 布尔值:true 转成 1,false 转成 0Number(true) // 1Number(false) // 0// undefined:转成 NaNNumber(undefined) // NaN// null:转成0Number(null) // 0// Number 方法如果是对象,除非包含单个数值的数组,否则都返回 NaNNumber({a: 1}) // NaNNumber([1, 2, 3]) // NaNNumber([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
。
undefined
null
-0
或+0
''
空字符串NaN
注意,所有对象,包括空对象转换的结果都是true
Boolean({}) // trueBoolean([]) // trueBoolean(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: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()
输出信息时,会在前面上一个空色的叉,表示出错
还有其他一些,平时很少用到,这里不做表述