# 隐式类型转换过程
- 当进行一些操作时,JS 会自动调用内部的函数进行隐式类型转换,例如:
==判断
,数据类型不同的加减法操作
,数据前加 + 或 -(+new Date()
)或${obj}
等 - 两个引用数据类型(对象)之间不会发生隐式类型转换,双等符号(==)也会判断其栈中的地址
- 隐式类型转换内部使用的函数有:ToNumber、ToString、ToBoolean、ToPrimitive(底层)等
- ToNumber 对
引用数据类型
会先使用ToPrimitive('number')
,然后使用Number()
进行转换 - ToString 对
引用数据类型
会先使用ToPrimitive('string')
,然后使用String()
进行转换 - ToBoolean 对
null
,undefined
,false
,NaN
,''
,0
,-0
转换为false
,其余都转换为true
当进行条件判断时,会调用
ToBoolean
方法。
当引用数据类型(对象)转换到number
和string
时,使用的ToNumber
和ToString
都会使用ToPrimitive
算法,将对象尝试转为原始数据类型(转换失败会报错)
ToPrimitive 接收一个hint
参数,该参数只能取值:string
、number
或default
。转换流程如下:
- 存在 [Symbol.toPrimitive],则直接调用,不存在则走如下流程
- 如果
hint
是number
或者default
,则先调用该对象的valueOf
和toString
,直到返回基本类型 - 如果
hint
是string
,则会依次调用该对象的toString
和valueOf
,直到返回基本类型
# 对象的 [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 异常。