一、把其他类型转换为number类型的两种方法
- Number
- parseInt/parseFloat
二、什么情况下其他数据类型会转换为Number
- 特定需要转换为Number(Number(val),parseInt/parseFloat(val))
- 隐士转换(浏览器内部默认要转换为Number再进行计算)
- isNaN(val)
- 数学运算(特殊情况,+在出现字符串的情况下不是数学运算,是字符串拼接)
- 在==比较的时候,有些值需要转换为数字再进行比较
三、Number([val])的转换规则
console.log(Number('')) //0
console.log(Number('10')) // 10
console.log(Number('10px')) // NaN
console.log(Number(true)) // 1
console.log(Number(false)) // 0
console.log(Number(null)) // 0
console.log(Number(undefined)) // NaN
console.log(Number(Symbol(''))) // 不允许转换
console.log(Number(BigInt('10n'))) // 10
console.log(Number({})) // NaN
console.log(Number([])) // 0
console.log(Number([10])) // 10
console.log(Number([10, 20])) // NaN
四、parseInt的转换规则
parseInt('10px12') // 10
parseInt('10.5px') // 10
parseFloat('10.5px') // 10.5
五、其他数据类型转换为字符串
- toString()
- String()
- 隐士转换 在加号运算的时候,如果加号的某一边出现字符串,则不是数学运算,而是字符串拼接 把对象转为数字类型,需要先toString(对象.toString方法是检测数据类型)
六、转换为boolean类型
- !
- Boolean([val])
- 隐式转换 在+号运算 循环或者条件判断中,只有0、‘’空字符串、NaN、null、undefined五个值会变为false,其他都是true
七、练习题
1. 加号在JS中不一定是数学运算,只要一边出现字符串、对象、数组都要变为字符串拼接
let result = 10 + false + undefined + [] + 'Tencent' + null + true + {}
console.log(result) // NaNTencentnulltrue[object Object]
2. parseInt
parseInt从左到右,找到是数组,找不到是NaN isNaN会通过Number进行隐士转换
parseInt('') // NaN
Number('') // 0
isNaN('') // false =>isNaN(Number(''))
parseInt(null) // NaN => parseInt('null')
Number(null) // 0
isNaN(null) // false
parseInt('12px') // 12
Number('12px') // NaN
isNaN('12px') // true
parseFloat('1.6px') + parseInt('1.2px') + typeof parseInt(null) //2.6number
isNaN(Number(!!Number(parseInt('0.8'))) // false
typeof !parseInt(null) + !isNaN(null) // 'booleantrue'
3. ==相关的类型转换
{} == [] // false 对象比较的是堆内存的地址
[] == [] // false
NaN == NaN // false
类型不一样的比较
- null == undefined // true ,但换成===结果是false(因为类型不一样),剩下的null/undefined和其他任何数据类型都不一样
- 字符串 == 对象 要把对象转换为字符串
- 剩下的如果== 两边数据类型不一致,都需要转换成数字再进行比较
console.log(1==true) // false 类型不一样转换成数字
console.log([] == false) // true
console.log(![] == false) //true
4parseInt面试题
parseInt([string], [radix]) radix省略或者为0,则radix默认按照10进行处理(特殊:字符串以0x开头,radix默认按照16进行处理) radix不在2~36之间,最后结果都是NaN
let arr = [10.8, 0, 10, 25, 23]
arr = arr.map(parseInt)
console.log(arr) // [10, NaN, 2,2, 11)
解析: parseInt('10.8', 0)=>10 parseInt('0', 1) => 第二个参数 1不在2~36之间,所以是NaN parseInt('10', 2) => 2 parseInt('25', 3) => 找到的3进制的字符只有2, 2*3^0 => 2 parseInt('23', 4) => 11