JS类型转换

176 阅读2分钟

首先,在JS中类型转换只有三种情况,分别是:

  • 转为布尔值
  • 转为数字
  • 转为字符串

先来看一个类型转换表格,然后再进入正题

1、转Boolean

在条件判断时,除了 undefuned、null、false、NaN、' ' 、0 、-0 ,其它所有的值都转为true,包括所有对象

2、对象转原始类型

对象在转换类型的时候,会调用内置的[[ToPrimitive]]函数,对于函数来说,算法逻辑一般来说如下:

  • 如果已经是全是类型了,就不需要转换了
  • 调用 x.valueOf(),如果转换为基础类型,就返回转换的值
  • 调用 x.toString(),如果转换为基础类型,就返回转换的值
  • 如果没有返回原始类型,就会报错

当然也可以重写 Symbol.toPrimitive,该方法在转原始类型时调用优先级最高

let a = {
  valueOf() {
    return 0;
  },
  toString() {
    return '1';
  },
  [Symbol.toPrimitive]() {
    return 2
  };
};

1 + a // => 3

3、四则运算符

加法运算符不同于其它几个运算符,它有以下几个特点:

  • 运算其中一方为字符串,那么就把另一方也转换为字符串

  • 如果一方不是字符串或者数字,那么会将它转换为数字或者字符串

    1 + '1' // '11' true + true // 2 4 + [1,2,3] // "41,2,3"

    // 对于第一行代码来说,触发特点一,所以将数字1转换为字符串,得到结果'11' // 对于第二行代码来说,触发特点二,所以将true转换为数字1 // 对于第三行代码来说,触发特点二,所以将数组通过toString转为字符串1,2,3,得到结果41,2,3

另外对于加法还需要注意个表达式

'a' + + 'b'  // -> "aNaN"

// 因为 + 'b' 等于 NaN ,所以结果为"aNaN",有时候可以通过 + '1' 的形式来快速获取number类型。

那么对于除了加法的运算符来说,只要其中一方是数字,另一方就会转为数字

4 * '3'    // 12
4 * []     // 0
4 * [1,2]  // NaN

4、比较运算符

  • 如果是对象,就通过 toPrimitive 转换对象

  • 如果是字符串,就通过 unicode 字符所以来比较

    let a = { valueOf() { return 0; }, toString() { return '1'; } };

    a > -1 // true

    // 因为a是对象,所以通过valueOf转换为原始类型再比较值。

---END---