文章目录
前言
这里记录了个人遇到的一些数据类型转换,显性的隐性的都有,非常琐碎。
这些转换的问题一般在项目中我们都要规避掉,所以还是需要看看的。如果你都能记住,我愿称你为大神!
强制转换
数字转换
Number() 转成数字
使用Number()
函数进行转换。
被转对象 | 结果 |
---|---|
字符串 | 1. 数字内容的字符串可以直接转换为数字 ,但是字符串里有非数字,则会转化为NaN 。2. 空字符串或空格字符串,转换为0 |
布尔值 | true 会变为1 ,false 为0 |
null | 0 |
undefined | NaN |
使用例子:
console.log(Number(""));
parseInt() 向下取整
被转对象 | 结果 |
---|---|
字符串 | 1. 在遇到不能解析的内容时会自动返回前面已经解析好的内容,比如'12a23.2' ,只能识别出12 。2. 如果是第一位字符不能解析那么会直接返回NaN ,比如'a123.2' 识别不出显示NaN , 表示不是一个数字 |
数字 | 正常向下取整 |
parseFloat() 转成浮点
和parseInt()
一样,注意事项日后再记录
在把字符串转成数字类型时,最好都用Number()
方法,原因:
- 因为当字符串为16进制或者科学计数法时,
parseInt()
和parseFloat()
转换的规则会有些不同。 - 如果字符串带小数点,转换后会被去掉。
字符串转换
String() 转成字符串
被转对象 | 结果 |
---|---|
布尔 | true 为'true' ,false 为'false' |
数字 | '数字' |
null | 'null' |
undefined | 'undefined' |
布尔值转换
Boolean()
被转对象 | 结果 |
---|---|
字符串 | 空字符串为false ,其他都是true |
数字 | 0 为false ,其他都是true |
null | false |
undefined | false |
NaN | false |
对象 | true |
引用类型转换
如果你用以上api对引用类型做强制转换或者下文讲的隐式转换,会依次触发这个引用类型的三个api
Symbol.toPrimitive
看是否能得到原始值,再转换- 上面不能的话再调
valueOf
事件的执行,再转换, - 上面不能的话再换调用
toString
这个方法再进行转换。
例如:
Number({})
// {}['Symbol.toPrimitive']无效,再看{}.valueOf() 是无效代码,换成{}.toString(),结果为[object object]
Number('[object object]') // 结果为NaN
隐式转换(语境转换)
加减乘除余号
记住几个特殊的要点就都明白了:
- 相加的时候,必定有两边,其中有一边是字符串,另一边用
String()
转成字符串后直接拼接 - 有一边为
NaN
,无论怎么运算结果都是NaN
- 其他情况都用
Number()
会先转成数字类型再运算
使用例子:
let str = '1'
let num = +str // 命中第三条,变成了数字1
大于小于号
比大小之前记住要诀:
- 两边都是字符串,比较首位字符的表顺序
- 有一边为
NaN
,直接判定为false
- 其他的情况都先
Number()
转换,然后比较
==号松散比较
还是记住情况即可:
- 两边都是不同的值类型,转成数字后再比较
- 一边值类型一边引用类型,引用类型转成值类型再比较
undefined
和null
与自己比较或者两者相互比较的时候,才会返回true
- 有一边为
NaN
,直接判定为false
- 其他情况就是相同类型的正常比较了
规则很多,所以eslint禁止使用这种松散比较。
放些题做做:
false == ''
为truetrue == 'true'
为 falsetrue == 1
为true{} == null
是falselet obj ={} ; obj == {}
是falseundefined == null
是true[] == 0
是true
如果是!=
符号,就是==
的取反。
隐式转换会带来一些便利,例如可以通过obj.a == null
,来判断是否obj.a
等于null
或者undefined
。但是这样代码的可读性很差,不推荐。
===严格比较
这种要记的就很少了:
- 有一边为
NaN
,直接判定为false
- 其他情况必须类型相同
如果是!==
符号,就是===
的取反。
||符号
分步骤:
- 第一,先将第一个转换为布尔
- 如果第一个为true,返回第一个原值
- 如果第一个为false,返回第二个原值
// 应用,给默认值
let arr = xxx || []
&&符号
分步骤:
- 第一,先将第一个转换为布尔
- 如果第一个为true,返回第二个原值
- 如果第一个为false,返回第一个原值
// 应用,执行函数
callback && callback()
以上这两个判断符号在实际开发中不会这么刁钻的,大家都约定俗成的将两边写为布尔值
!!号
可以把不同变量类型转成布尔类型,只需要记住转成false有哪些情况,其他的几乎都是true:
let arr = [undefined, null, "", NaN, 0, false];
// 例如
console.log(!!arr[0]) // false
转成true的叫做truely变量,转成false的叫做falsely变量
这个我看很少人会用,当却是非常好用的东西。
if转换
就是当用来做if条件判断的时候,直接就使用Boolean()
进行强制转换
来几个变态测试题
let a = // 要等于什么下面才会为true
console.log(a==1 && a ==2 && a ==3)
答案
let a = {
n: 0,
valueOf: function() {
return ++this.n
}
}