JavaScript 复习之语法专题

188 阅读5分钟

一、数据类型的转化

强制转换

主要指使用Number(), String(), Boolean()三个函数。

  1. 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方法返回的是对象,就报错。

  1. 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方法返回的是对象,就报错。

  1. Boolean() 它的转换规则相对简单:除了以下五个值的转换结果为false,其他的值全部为true
  • undefined
  • null
  • -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 中错误对象。

  1. SyntaxError 对象(解析代码时发生的语法错误)
  2. ReferenceError 对象(引用一个不存在的变量时发生的错误)
  3. RangeError 对象(一个值超出有效范围时发生的错误,主要有几种情况,一是数组长度为负数,二是Number对象的方法参数超出范围,以及函数堆栈超过最大值)
  4. TypeError 对象(变量或参数不是与其类型时发生的错误)
  5. URIError 对象(URI 相关函数的参数不正确时抛出的错误)
  6. 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代码块,表示不管是否出现错误,都必需在最后运行的语句。

注意:遇到只有tryfinally语句的情况。在try代码块中如果出现return语句,或者throw语句。其执行顺序是排在finally代码之前,但是它要等到finally代码执行完毕后才返回。

function idle(x) {
  try {
    console.log(x);
    return 'result';
  } finally {
    console.log('FINALLY');
  }
}

idle('hello')
// hello
// FINALLY

遇到存在trycatchfinally语句的情况,进入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 对象的静态方法

  1. console.log()平时用的比较多,用于在控制台输出信息
  2. console.info()console.log()的别名,用法完全一样
  3. console.debug()console.log方法类似,会在控制台输出调试信息。但是,默认情况下,console.debug输出的信息不会显示,只有在打开显示级别在verbose的情况下,才会显示。
  4. console.warn()log不同之处在于,输出信息时,前面将一个黄色三角,表示警告。
  5. console.error()输出信息时,会在前面上一个空色的叉,表示出错

还有其他一些,平时很少用到,这里不做表述