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"
。
细节是不是挺多的,怎么样,这回都会了吧?