JavaScript-语法专题

一、数据类型的转换

  1. 概述

    JavaScript是一种动态语言,变量没有类型限制,可以随时赋予任意值

  2. 强制转换:主要是值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会自动转换数据类型。

    1. 不同类型的数据互相运算

      123 + "abc";  //  123abc
      
    2. 对非布尔值类型的数据求布尔值

      if ('abc') {
        console.log('hello')
      }  // "hello"
      
    3. 对非数值类型的值,使用+,-

      + {foo: 'bar'} // NaN
      - [1, 2, 3] // NaN
      

二、错误处理机制

  1. Error实例对象:JavaScript解析代码,一旦发送错误,就会抛出一个错误对象。

    var err = new Error("出错了");
    err.message;    // 出错了
    
  2. 原生错误类型

    SyntaError对象:解析代码时发送的语法错误

    ReferenceError对象:引用一个不存在的变量时发生的错误

    RangeError对象:一个值超出有效返回时发送的错误

    TypeError对象:变量或者参数不是预期类型时发送的错误

    URLError对象:是URL相关函数的参数不正确时抛出的错误

    EvalError对象:eval函数没有被正确执行时,会抛出EvalError错误

  3. 自定义错误

    function UserError(message) {
      this.message = message || '默认信息';
      this.name = 'UserError';
    }
    
    UserError.prototype = new Error();
    UserError.prototype.constructor = UserError;
    
    new UserError("这是一个自定义错误")
    
  4. throw语句:手动中断程序执行,抛出一个错误

    if (x <= 0) {
      throw new Error('x 必须为正数');
    }
    
    // throw 它可以抛出任意类型,不单单只是Error对象
    
  5. 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);
      }
      // ...
    }
    
  6. finally代码块:不管程序是否出错,都会执行

原文地址:https://www.cnblogs.com/zhuchunyu/p/10648633.html