深入理解JavaScript数据类型(全网最全)
程序员文章站
2022-06-04 21:59:19
...
1. number数字类型
NaN: not a number 但是它是数字类型
isNaN:检测是否为有效的数字
来分析一段代码:
isNaN(12); => false
isNaN('12'); => false
isNaN('很好'); => true
isNaN(true); => false
isNaN(null); =>false
isNaN(undefined); => true
isNaN({age: 9}); => true
isNaN([12, 23]); => true
isNaN([12]); =>false
isNaN(/^$/); => true
isNaN(function(){}); => true
首先分析isNaN检测的机制
- 首先验证当前值是否为数字类型,否则默认转为数字类型,使用Number这个方法来转换
【字符串转数字】
Number(‘13’) -> 13
Number(‘12px’) -> NaN 出现任意一个非数字的时候
Number(’’) -> 0
【布尔转数字】
Number(true) -> 1
Number(false) -> 0
【其它】
Number(null) -> 0
Number(undefined) -> NaN
-注:将引用数据类型值转换为数字: 先把引用值调取toString()转换为字符串,然后调Number
【对象】
({}).toString() -> ‘[object Object]’ ->NaN
数组对象:
[12, 23].toString() -> ‘12, 23’ -> NaN
[12].toString() -> ‘12’ -> 12
[].toString() -> ‘’ 所以 isNaN([]): false- 已经为数字类型,是有效数字返回false,不是返回true(数字类型中只有NaN不是有效数字,其他都是)
2.NaN
NaN == NaN: false //NaN和谁都不相等,包括它自己
测试代码:
if(Number(num) == NaN) {
alert('num不是有效的数字');
}
//if条件永远为false 不可行
if(isNaN(num)) {
alert('num不是有效的数字');
}
3.布尔类型
为false只有五个值
- null
- undefined
- ‘’(空字符串)
- 0
- NaN
其余都是true
4.null && undefined
代表空或者没有
- null: 空对象指针
- undefined: 未定义
5. typeof
在JS中用来检测数据类型的方式之一。除了它以外,还有:
- instanceof
- constructor
- Object.prototype.toString().call()
返回值:使用typeof检测出来的结果是一个字符串,字符串中包含着对应的数据类型,如“number”/“string”/“boolean”/“undefined”/“object”/“function”typeof NaN
=> “number”typeof null => "object" 因为null代表空对象指针,没有指向任何的内存空间
typeof检测数组/正则/对象, 最后返回的都是"object"
6. 把其它类型值转换为字符串
1.发生的情况
- 基于alert / confirm / prompt / document.write等方法输出内容的时候,会把输出的值转换为字符串,然后输出
alert(1) => '1'
- 基于“+”进行字符串拼接
- 把引用类型值转换为数字时,首先会转换为字符串
- 给对象设置属性名,如果不是字符串,首先转换为字符串,然后再当做属性存储到对象中(对象的属性只能是数字或字符串)
- 手动调用toString/toFixed/join
2.转换规律
【除了对象,都是直接加引号】
【一切对象,变成‘[object Object]’】
7.特殊情况
1 + true => 2 //数学运算
'1' + true => '1true' //字符串拼接
[12]+10 => '1210' // 引用类型转换为数字 首先会转换为字符串 因此变成字符串拼接
[] + 10 => '10'// [] => "" 变成字符串拼接
({}) + 10 => "[object Object]10"
/*高能预警*/
{} + 10 => 10 //它根本就不是数学运算,也不是字符串拼接,它是两部分代码:{}是代码块,+10才是我们的操作
{} + [] => 0 // +[]转换为0
{} + {} => "[object Object][object Object]" //两个对象相加,首先转换为字符串,于是发生字符串拼接
/* == 辨析 */
对象==对象: 不一定相等,因为对象操作的是引用地址
{name: 'xxx'} == {name: 'xxx'} // false
[] == [] //false
对象==数字: 把对象转换为数字
对象==布尔: 把对象转换为数字,把布尔也转换为数字
对象==字符串:把对象转换为数字,把字符串也转换为数字
字符串==数字:字符串转换为数字
字符串==布尔:都转换为数字
========================>不同情况的比较都是转换为数字再比较
null == undefined : true
null === undefined: false
null && undefined 和其他值都不相等
[] == false//都变成数字 0==0, true
![] == false //先算![], 把数组转换为布尔取反,即!Boolean([]),false, false == false 结果是true
[] == true //都变成数字 0==1, false
结尾再来个彩蛋吧:):
12 + true + false + null + undefined +[] + '嗨' + null + undefined + [] + true 输出啥?
...思考一下:
"NaN嗨nullundefinedtrue"