数据类型
首先我们了解一下,Js中有哪些数据类型。
基本数据类型:Undefined、Null、Boolean、Number、String、Symbol、BigInt。
引用数据类型:Arrary,普通对象,date(),正则,函数
隐式转换和显式转换
隐式转换
:通常包括有数学运算(+-*/),isNaN(),==比较
显示转换
:Boolean()、Number()、String()等
其他类型值转换为数字
Number([val])
- 字符串转化为数字,空字符串是0,如果出现任何非有效数字,结果是NaN
- true -> 1 false-> 0
- null -> 0 undefined -> NaN
- symbol不能转化为数字,会报错
- BigInt会去除n
- 对象转化为数字
- 先调用Symbol.toPrimitive方法,如果不存在这个方法
- 再调用对象的valueOf获取原始值,如果获取的值不是原始值
- 再调用toString把其变成字符串
- 最后再把字符串基于Number方法转化为数字
parseInt([val],[radix])
- [ val ]必须是字符串,如果不是,要先隐式转换为字符串 String([val])
- [ radix ]进制
- 如果不写,或者写零:默认是10(特殊情况:如果字符串是0x开始的,默认是16进制)
- 有效范围:2~36之间,如果不在这个区间,结果直接是NaN
- 从[ val ]字符串左侧第一个字符开始查找,查找出符合[radix]进制的值(遇到不符合的则直接结束查找,不论后面是否还有符合的);把找到的内容,按照[radix]进制,转换为10进制!
其他类型值转换为字符串
String([val])和[val].toString()
String([val])会经历严格的三个步骤,最后不一定变成字符串
- 先调用Symbol.toPrimitive方法,如果不存在这个方法
- 再调用对象的valueOf获取原始值,如果获取的值不是原始值
- 再调用toString把其变成字符串
[val].toString()
[val].toString()一定会转换成字符串。它和String()的区别是String()会调用对象中的valueOf()方法,从而返回的可能不是一个字符串。
+
+
出现在左右两边,其中一边是字符串,或者是某些对象,会以字符串拼接开始处理,其他情况都是数学运算。
其他值到布尔类型的值的转换规则
以下这些是假值:
• undefined
• null
• false
• +0、-0 和 NaN
• ""
假值的布尔强制类型转换结果为 false。从逻辑上说,假值列表以外的都应该是真值。
小试牛刀
第一题
let res = 100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false console.log(res)
首先 100 + true没有遇到字符串或者对象,是数学运算,true会转化成1,结果是101。 101 + 21.2是122.2. 122.2 + null还是122.2。undefined转为数字,是NaN,任何数加NaN都是NaN。所以122.2 + undefined会变成NaN。从此之后,都会变成了字符串拼接了,NaNTencent + []。[]变成空字符串,null变成"null",9变成"9",false变成"false"。
所以最终输出NaNTencentnull9false
第二题
let arr = [27.2, 0, '0013', '14px', 123]; arr = arr.map(parseInt) console.log(arr)
前置知识
map遍历会有两个参数map((item,index)=>{}),分别是当前项和索引值,这两个参数会传入paseInt里面,相当于我们要计算以下值的结果
parseInt(27.2,0) parseInt(0,1) parseInt('0013',2) parseInt('14px',3) parseInt('123',4)
第一个,我们已经说了,如果第二个参数不写或者是0,默认都是10进制。先转换为字符串,然后就输出了27。
第二个,radix的范围是2~36,1不在这个范围,直接是NaN
第三个,'0013'中二进制只有'001',转换成10进制直接输出1
第四个,'14px'变成三进制,有效的是'1',对应的10进制输出是1
第五个,'123'变成了四进制,都是有效的,所以输出对应的10进制是3 + 24 + 14^2 = 27
小知识
isNaN 和 Number.isNaN 函数的区别
NaN
(not a number)意味着它不是一个数字,但是typeof NaN 是number。NaN是一个特殊值,它和自身不相等
isNaN()函数
在判断是否为NaN时,需要先进行数据类型转换
,只有在无法转换为数字时才会返回true
;
Number.isNaN()函数
在判断是否为NaN时,只需要判断传入的值是否为NaN,不会进行数据类型转换。