NaNi???
一、显性类型转换
强制类型转换主要是指通过String、Number和Boolean等构造方法手动转换成对应的字符串、数字和布尔值。
1.1 转为字符串
1.1.1 原始类型转字符串
原始类型 | 字符串 |
---|---|
string :‘str’ | “str” |
number : 123 | “123” |
Boolean | “true”/“false” |
null | “null” |
undefined | “undefined” |
1.1.2 对象转字符串
1、如果对象有toString()方法,则调用toString()方法,如果返回原始值,则按照原始值转换规则转换成字符串。
2、如果对象没有toString()方法或者toString()方法返回的不是原始值,则调用valueOf()方法,如果返回原始值,则按照原始值转换规则转换成字符串
3、否则抛出错误:Cannot convert object to primitive value
常见对象的toString():默认是"[object Object]"
-
数组:将每个数组元素转换为一个字符串,并在元素之间添加逗号后合并成结果字符串 [1,2] “1,2”
-
函数 :将函数转换成源代码字符串function(){} “function(){}”
-
日期:返回日期和时间字符串new Date() “Thu Aug 13 2020 14:08:59 GMT+0800 (中国标准时间)”
-
正则:正则表达式字符串new RegExp("[^xyz]") “/[^xyz]/”
举例验证:
var obj = {
toString() {return {}},valueOf() {return {}}
}
1.2 转为数字
1.2.1 原始类型转数字
原始类型 | 数字 |
---|---|
true/false | 1/0 |
null | 0 |
undefined | NaN |
空字符串 | 0 |
数字字符串:“2.333” | 2.333 |
不可完全解析为数值的字符串 | NaN |
1.2.2 对象转数字
1、如果对象有valueOf()方法,调用valueOf()方法,如果返回原始值,则按照原始值转换规则。
2、如果没有valueOf()方法或valueOf()返回的不是原始值,则再调用toString()方法,如果原始值则按照原始值转换规则。
3、否则,则抛出错误:Cannot convert object to primitive value
大多数对象的没有原始值,valueOf()返回对象本身,例数组,函数,正则
日期会返回 1970年1月1日以来的毫秒数。
1.3 转为布尔值:
除以下几种情况返回false,其他都返回true
false、null、 undefined 、 ‘’ 、 NaN 、 0(+0、-0)
二、自动(隐性)类型转换
自动类型转换就是不需要人为强制的进行转换,js会自动将类型转换为需要的类型,所以该转换操作用户是感觉不到的,因此又称为隐性类型转换。自动类型转换实际上和强制类型转换一样,也是通过String()、Number()、Boolean()等构造函数进行转换,只是该操作是JS自己自动完成的而已。自动类型转换的规则和强制类型转换的规则一致。
2.1转为字符串
字符串自动转换主要表现为字符串的拼接,字符串和其他类型用加号(+)拼接时,其他类型都自动转换为字符串。
'str' + 1 ====> "str1"
'str' + 'str' ====>"strstr"
'str' + null ====>"strnull"
'str' + undefined ====>"strundefined"
'str' + true ====>"strtrue"
'str' + {} ====>"str[object Object]"
2.2转为数字
在所有加减乘除等需要数字类型的地方,JS会自动转换成数字(除字符串与‘+’组合)。
-
-
- / %
-
== 、 >= 、 <= 、 < 、>
'1' - '2' ====> -1
'1' - null ====>1
'1' - undefined ====>NaN
'1' - true ====>0
'1' - NaN ====>NaN
'1' * 'a' ====>NaN
'1' - {} ====>NaN
'1' + 222 ====> 1222
2.3转为布尔
下面的情况会发生 布尔值隐式强制类型转换。
(1) if (…) 语句中的条件判断表达式。
(2) for ( … ; … ; … ) 语句中的条件判断表达式(第二个)。
(3) switch,while (…) 和 do…while(…) 循环中的条件判断表达式。
(4) ? : 中的条件判断表达式。
(5) !
(6) 逻辑运算符 ||(逻辑或)和 &&(逻辑与)左边的操作数(作为条件判断表达式)。
判等:
==:
null、undefined 除了和自身或者彼此==, 剩下和谁都不==
NaN和谁都不==
在判断 == 时,要先Number() 将两个操作数强制转为 Number 类型
测验
欢迎讨论 特别最后一个
1.undefined 转为数字类型是什么
2.var obj = {
toString() {return {}},valueOf() {return undefined}
}
Number(obj) 输出什么?
3.console.log(‘str’+{})
console.log(null == undefined)
console.log(null == 0)
console.log(null == false)
console.log(null == NaN)
console.log(undefined== 0)
console.log(undefined== false)
console.log(undefined== NaN)
console.log(NaN== NaN)
5.转换为布尔类型为false的几种情况?
6.
console.log([]==![])
console.log({}==!{})
happy everyday~