# 隐式类型转换过程

隐式类型转换

  • 当进行一些操作时,JS 会自动调用内部的函数进行隐式类型转换,例如: ==判断 ,数据类型不同的 加减法操作 ,数据前加 + 或 -( +new Date() )或 ${obj}
  • 两个引用数据类型(对象)之间不会发生隐式类型转换,双等符号(==)也会判断其栈中的地址
  • 隐式类型转换内部使用的函数有:ToNumber、ToString、ToBoolean、ToPrimitive(底层)等
  • ToNumber 对 引用数据类型 会先使用 ToPrimitive('number') ,然后使用 Number() 进行转换
  • ToString 对 引用数据类型 会先使用 ToPrimitive('string') ,然后使用 String() 进行转换
  • ToBoolean 对 nullundefinedfalseNaN''0-0 转换为 false ,其余都转换为 true

当进行条件判断时,会调用 ToBoolean 方法。
当引用数据类型(对象)转换到 numberstring 时,使用的 ToNumberToString 都会使用 ToPrimitive 算法,将对象尝试转为原始数据类型(转换失败会报错)
ToPrimitive 接收一个 hint 参数,该参数只能取值: stringnumberdefault 。转换流程如下:

  • 存在 [Symbol.toPrimitive],则直接调用,不存在则走如下流程
  • 如果 hintnumber 或者 default ,则先调用该对象的 valueOftoString ,直到返回基本类型
  • 如果 hintstring ,则会依次调用该对象的 toStringvalueOf ,直到返回基本类型

# 对象的 [Symbol.toPrimitive] 方法

// 修改 Symbol.toPrimitive 方法,改变其隐式类型转换
const obj1 = {};
console.log(+obj1);     // NaN
console.log(`${obj1}`); // "[object Object]"
console.log(obj1 + ""); // "[object Object]"
// 接下面声明一个对象,手动赋予了 Symbol.toPrimitive 属性,再来查看输出结果
const obj2 = {
  [Symbol.toPrimitive](hint) {
    if (hint == "number") {
      return 10;
    }
    if (hint == "string") {
      return "hello";
    }
    return true;
  }
};
console.log(+obj2);     // 10      -- hint 参数值是 "number"
console.log(`${obj2}`); // "hello" -- hint 参数值是 "string"
console.log(obj2 + ""); // "true"  -- hint 参数值是 "default"

# []

# 快速记忆流程

一、原始类型 -> 数字:

二、所有转 boolean

三、原始类型

四、对象转原始类型

四、对象转原始类型

# 具体转换规则为:

  • 如果该值已经是原始数据类型(string、number、boolean),则直接返回该值。

  • 如果其中一项是字符串,那另一项值就会转换成对应的字符串类型。

  • 如果该值是对象(Object),则调用该对象的 valueOf () 方法,如果返回的结果是原始数据类型,则直接返回该值。

  • 如果 valueOf() 方法的返回结果不是原始数据类型,则调用该对象的 toString () 方法,如果返回的结果是原始数据类型,则直接返回该值。

  • 如果 toString() 方法的返回结果不是原始数据类型,则抛出 TypeError 异常。

images

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

dmq 微信支付

微信支付

dmq 支付宝

支付宝