目录
- 一、隐式类型转换是什么
- 二、隐式类型转换的方式
- 三、部分常见值的转化结果
- 1. 通过Boolean()转化
- 2. 通过Number()转化
- 四、隐式类型转换的各种情况
- 1. if中的条件会被自动转为Boolean类型
- 2. `-减号`,`*`,`\`,`%`,`isNaN()`,`-负号,+正号`
- 3. 逻辑运算符(! , && , ||)
- 4. `+` 加法运算符
- 5. 比较运算符(== , < , >)
- 五、参考文献
一、隐式类型转换是什么
在js中,当运算符两边数据不统一,CPU无法计算,编译器就会自动将运算符两边的数据进行数据类型转换成一样的数据类型再计算。
这种由编译器自动转换的方式就称为隐式类型转换。
二、隐式类型转换的方式
- 将值转为布尔值,Boolean()
- 将值转为数字,Number()
- 将值转为字符串,toString()
三、部分常见值的转化结果
1. 通过Boolean()转化
- 会转化为false的值:undefined, null, -0, 0, NaN, “”
- 会转化为true的值:其他所有
2. 通过Number()转化
- 会转化为NaN的值:undefined,带字母或符号的字符串,所有引用类型(数组,对象,function,date等),NaN
- 会转化为0的值:null,"",+0,false
- 布尔值转化为数值:false–>0 ,true–>1
四、隐式类型转换的各种情况
1. if中的条件会被自动转为Boolean类型
2. -减号
,*
,\
,%
,isNaN()
,-负号,+正号
隐式调用Number()转化为数值类型
// 部分示例
-"4" // -4
+"7" // 7
9-"4" // 5
3. 逻辑运算符(! , && , ||)
- ! 隐式调用Boolean()转化为布尔值
- &&
会将第一个操作数转化为Boolean类型
若转化后第一个操作数为true,则返回第二个操作值;否则返回第一个操作数的原始值
// 部分示例
1 && "key" //key
"key" && "" // ""
null && "key" // null
undefined && 0 // undefined
||
若第一个操作值经转化后为false则返回第二个值,否则返回第一个的原始值
1 || "key" //1
"key" || "" // "key"
null || "key" // "key"
undefined || 0 // 0
4. +
加法运算符
- 操作值中有字符串,将其他类型的操作值通过toString()转化为字符串再拼接
- 其他情况都转化为数值类型
一些不常见情况
- NaN + 任意值 = NaN
- Infinity + Infinity = Infinity
- -Infinity + (-Infinity) = -Infinity
- Infinity + (-Infinity) = NaN
- +0 + (+0) = +0
- -0 + (-0) = -0
- +0 + (-0) = +0
- 3 + true = 4,将true转化为1
- 4 + false = 4,将false转化为0
- true + false = 1,将true转化为1,将false转化为0
5. 比较运算符(== , < , >)
类型转化规则:
当1层的对象类型与2层字符串进行比较,会将对象类型隐式转化为字符串类型,进行比较;
当2层的字符串类型或布尔类型与数值类型进行比较,会将2层的类型隐式转化为数值类型,进行比较;
当1层的对象类型与3层的数值类型进行比较,会先将对象类型转化为字符串类型再转化为数值类型;
当2层的类型相互比较,会均转化为数值类型再进行比较;
==
- String,Boolean,Number中的任意两个进行比较都会转化为Number类型再进行比较。
- 引用类型与基本类型比较,则调用对象的valueOf()方法,将对象转换为基本类型再进行比较。
- null与undefined比较或与自身比较,结果是true,与其他值比较都为false。
- 如果一个操作值为NaN,则返回false
- 两个引用类型比较,则比较他们是不是指向同一个对象
< , >
- 两个操作值都是数值,进行数值比较
- 两个操作值都是字符串,比较字符串对应的字符编码值
- 有一个操作值是数值,将另一个操作值转化为数值,进行数值比较
- 有一个操作数是对象,则调用valueOf() / toString()方法,得到的结果按照前面的规则执行比较
- 有一个操作值是布尔值,将其转化为数值再进行比较
- NaN不与任何值相等,包括它自己,它与任何值比较都返回false
五、参考文献