类型
6种基本类型null undefined number stringify boolean symbol
1种引用类型object
对象转换为基本类型
- 对象转换为字符串
1 | //模拟toString返回的不是基本类型值,value0f返回的基本类型值 |
对象转为数字
先判断valueOf方法, 再判断toString方法
1 | //value0f和toString返回的都不是基本类型值 |
Object.create(null)创建的对象没有valueOf和toString方法,因此转换报错
一般情况,我们不会重写valueOf和toString,大部分对象valueOfi返回的仍然是对象,因此对象转换为基本类型值
可以直接看toString返回的值
显式强制类型转换
- 转换为字符串
如果对象有自定义toString方法,则返回toString.方法的结果,若是toString返回的结果不是基本类型值,报错TypeError
1 | var obj = { |
-转换为boolean类型
null undefined false +0 -0 NaN “”
其他情况都是真值
- 转换为数字类型
1 | Number('')//0 |
对象首先被转换为相应基本类型值,再转换
1 | Number([])//0 |
隐式强制类型转换
- 转换为字符串
1 | var obj = { |
1 | console.log("123" == 123) |
x+”,会将x转换为字符串,+运算符其中一个操作数是字符串,会执行字符串拼接操作
对象和字符串拼接时,对象转为基本类型按转为数字转换,先判断valueOf,再判断toString
- 转换为布尔值
发生布尔值隐式强制类型转换的情况
1.if()语句中的条件判断表达式
2.for(…;…;…)语句中的条件判断表达式(第二个)
3.while()和do..while(..)循环中的条件判断表达式
4.?:中的条件判断表达式
5.逻辑运算符||(逻辑或)和&&(逻辑与)左边的操作数(作为条件判断表达式)
- 转换为数字类型
1 | +'2'//2 |
优先将数字转为字符串进行拼接
1 | console.log(3 + '4'); // 输出 "34" |
1 | const obj = { |
1 | const obj = { |
当一个操作数是布尔值时,布尔值会被先转换为数字(true被转换为1, false被转换为0),然后按照前面的规则执行加法运算。
1 | console.log(true + 3); // 4 |
当一个操作数是null或undefined时,null和undefined分别被转换为数字0和NaN,然后按照前面的规则执行加法运算。
1 | console.log(null+2); //2 |
1 | //减法运算符的规则 |
1 | console.log(10 / "2"); // 输出5 ('2'被转换为数字2) |
if语句后的隐式类型转换
以下类型会被转换为false, 其他类型会被转换为true
- false
- 0
- NaN
- null
- undefined
- 空字符串(“”)
1 | let emptyString = ""; |
1 | console.log(["1", "2", "3"].map(parseInt)) |
==和===
==允许在相等比较中进行强制类型转换,而===不允许
比较规则
1、字符串和数字比较,字符串先转换为数字,再比较
2、其他类型和布尔类型比较,布尔类型转换为数字,再比较
3、对象和非对象比较,对象转换成基本类型值,按转换为数字的流程转换后进行比较。对象转换优先级最高
1 | let myObject = { |
如果一个操作数是对象,另一个操作数是字符串或者数字,会首先调用对象的valueOf方法, 将对象转化为基本类型,再进行比较。
当valueOf()返回的不是基本类型的时候,才会调用toString()方法。
1 | let myObject = { |
1 | let a = { |
4、null和undefined,nul==undefined,其他类型和null均不相等,undefined也是如此
5、特殊情况
1 | NaN =NaN /false |
两个对象比较,判断的是两个对象是否是同一个引用
1 | "0"==false //true |