参考https://www.jb51.net/article/99702.htm
类型转换在js内部会有一个ToPrimitive操作,其会调用toString()方法和valueOf()方法,将值转换为基本类型值,若没有则报错。
对象转换为字符串时,先调用 toString() ,如果返回不是基础类型值,再调用 valueOf() 方法,如果返回基础类型值primValue,就返回String(primValue)。
对象转换为数字时,先调用valueOf(),再调用 toString() 方法。如果返回基础类型值primValue,就返回Number(primValue)。
valueOf() 返回相应的原始值
每个JavaScript固有对象的 valueOf 方法定义不同。
对象 | 返回值 |
---|---|
Array | 数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起。 |
Boolean | Boolean 值。 |
Date | 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。 |
Function | 函数本身。 |
Number | 数字值。 |
Object | 对象本身。这是默认情况。可以改写 |
String | 字符串值。 |
Math 和 Error 对象 | 没有 valueOf 方法。 |
ECMAScript中的==隐式转换规则:都是先转为数字再进行比较
- 如果有一个操作数是布尔值,则需要先把其转换为数值----false=0,true=1
- 如果一个操作数是字符串,另一个是数值,则需要先把字符串转换为数值
- 如果一个操作数是对象,则先调用valueOf(),若返回值不是基础类型,则调用toString()
一、强制类型转换:
Boolean()
空字符串、数字 0、undefined 或 null,转换为 false
var b1 = Boolean(""); //false - 空字符串
var b2 = Boolean("hello"); //true - 非空字符串
var b1 = Boolean(50); //true - 非零数字
var b1 = Boolean(null); //false - null
var b1 = Boolean(0); //false - 零
var b1 = Boolean(new object()); //true - 对象
var bb = Boolean([]) // true
Number()
Number.MAX_SAFE_INTEGER == Math.pow(2,53)-1
如果字符串值能被完整地转换,Number() 将判断是调用 parseInt() 方法还是 parseFloat() 方法。
Number(false) // 0
Number(true) // 1
Number(undefined) // NaN
Number(null) // 0
Number('1.2') // 1.2
Number('1.2.3') // NaN
Number(new Object()) //NaN
Number('50') // 50
String()
可以将一切值转换为字符串,而toString()方法无法转换null和undefined
String(null) // 'null'
String(undefined) // 'undefined'
String({}) // "[object Object]"
String({'a':1}) // "[object Object]"
String([]) // ""
String([1,2,3]) // "1,2,3"
二、自动类型转换
转换为Boolean的情况:if语句中,除了undefined、null、-0、0、+0、NaN、’‘,其他都自动转为true
转换为String的情况:加法运算中,只要有一个值为字符串则非字符串转换为字符串。
转换为Number的情况:除了加法运算的其他运算符都将转换为数值。
+'abc' // NaN
-'abc' // NaN
+true // 1
-false // 0
常考例子:
[] == ![] // 相当于 [] == false --> [] == 0 --> '' == 0 --> 0==0 --> true
{} == !{} // 相当于 {} == false --> {}调用toString()方法返回 NaN -->NaN == 0 --> false
[] == !{} // --> '' == false --> 0==0 --> true
{} == ![] // NaN == false --> false