1. 来试试看,以下12道题是否能一次性全答对:
parseInt("")
Number("")
isNaN("")
parseInt(null)
Number(null)
isNaN(null)
parseInt("12px")
Number("12px")
isNaN("12px")
parseFloat("1.6px") + parseInt("1.2px") + typeof parseInt(null)
isNaN(Number(!!Number(parseInt("0.8"))))
typeof !parseInt(null) + !isNaN(null)
答案:
parseInt("") // NaN
Number("") // 0
isNaN("") // false
parseInt(null) // NaN
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"
全做对了?基础很扎实哦!棒棒哒!!!
没全做对?那就趁热巩固一下吧!
2. 巩固
parseInt()处理的值是字符串,从字符串的左侧开始查找有效数字字符,遇到非有效数字字符则停止查找(==如果处理的值不是字符串,需要先转化为字符串然后再开始查找==)。详细请参考:parseIntNumber()直接调用最底层的数据类型检查机制来完成,其中:
| 值 | 被转化为 |
|---|---|
| true | 1 |
| false | 0 |
| null | 0 |
| "" | 0 |
| undefined | NaN |
==字符串中必须保证都是有效数字才会转换为数字,否则都是NaN==。详细请参考:Number |
有了以上知识的铺垫,我们来逐个分析以上的题:
parseInt("") // NaN
parseInt传入的参数是空字符串"",它不包含任何有效数字,所以结果为NaN。
Number("") // 0
Number函数底层将空字符串转化为0。
isNaN("") // false
isNaN传入的参数是空字符串""不是数值,首先将参数转化为数值(即调用Number("")),得到结果为0,然后再执行isNaN(0),0是一个数值,所以isNaN(0)的结果为false。
parseInt(null) // NaN
parseInt传入的参数是null不是一个字符串,首先将null转化为字符串(即调用String(null)),得到结果为字符串"null",然后再执行parseInt("null"),因为字符串"null"不包含任何有效数字,所以结果为NaN。
Number(null) // 0
Number函数底层将null转化为0。
isNaN(null) // false
isNaN传入的参数是null不是数值,首先将参数转化为数值(即调用Number(null)),得到结果为0,然后再执行isNaN(0),0是一个数值,所以isNaN(0)的结果为false。
parseInt("12px") // 12
parseInt从字符串的左侧开始查找有效数字字符,遇到非有效数字字符则停止查找,所以遇到字符p停止查找,结果为12。
Number("12px") // NaN
Number()传入的字符串参数中必须保证都是有效数字才会转换为数字,否则都是NaN,所以结果为NaN。
isNaN("12px") // true
isNaN传入的参数是字符串"12px"不是数值,首先将参数转化为数值(即调用Number("12px")),得到结果为NaN,然后再执行isNaN(NaN),NaN不是一个数值,所以isNaN(NaN)的结果为true。
parseFloat("1.6px") + parseInt("1.2px") + typeof parseInt(null) // "2.6number"
等价于:
1.6 + 1 + typeof NaN
进一步又等价于:
2.6 + "number"
+运算符中存在字符串的时候就变成了==字符串拼接==,所以结果为字符串"2.6number"。
isNaN(Number(!!Number(parseInt("0.8")))) // false
一步步拆解:
parseInt("0.8")结果为0,
Number(0)结果为0,
!!Number(0)即为!!0,!0结果为true,所以!!0结果为false,
isNaN(false)即为isNaN(0),0是一个数值,所以结果为false
typeof !parseInt(null) + !isNaN(null) // "booleantrue"
一步步拆解,等价于:
typeof !NaN + !false
又等价于:
typeof true + true
又等价于:
"boolean" + true
字符串拼接,所以最终的结果为字符串"booleantrue"。
细节是不是挺多的,怎么样,这回都会了吧?