js数据类型转换
js数据类型
基本数据类型 number、string、undefined、null、boolean、symbol、bigint
应用数据类型
- 标准普通对象: object
- 标准特殊对象: Array、RegExp、Date、Math、Error...
- 非标准特殊对象(包装对象):Number、String、Boolean...
- 可调用对象/执行对象:function
其它类型转换为数字型
Number([val]) 转换规则:
- 字符串转换为数字:空字符串转为0,如果出现的是任何非有效数字字符,结果都是NaN
Number(''); // 0
Number('12a'); // NaN
- 布尔值转换为数字
Number(true); // 1
Number(false); // 0
- null 和 undefined
Number(null); // 0
Number(undefined); // NaN
- Symbol无法转换为数字,会报错:Uncaught TypeError: Cannot convert a Symbol value to a number
- BigInt去除'n'(超过安全数字的,会按照科学计数法处理)
Number(10n); // 10
-
把对象转换为数字
-
先调用对象的Symbol.toPrimitive方法,如果不存在该方法
-
在调用对象的valueOf获取原始值,如果获取的值不是原始值
任何一个对象都有valueOf方法,即便这个对象上没有也会通过原型链找到Object对象的原型上的valueOf
- 在调用对象的toString 将其转换为字符串
- 最后在把字符串基于Number方法转换为数字
-
parseInt([val],[radix]) 参数说明:
- [val]:必须是一个字符串,如果不是先隐式转换为字符串【通过String([val])转换】
注意:val为数字时,也会被转换为字符串。
-
[radix]
-
如果不写,或者写0:默认是10进制【特殊情况:如果字符串是以0x开始的,默认是16进制】
-
有效范围:2~36之间【如果不在这个区间,结果直接是NaN】
进制的范围:
- 2进制:01
- 3进制:012
- 8进制:0~7
- 10进制:0~9
- 16进制:0
9 AF - 36进制:0
9 AZ
-
转换规则:
- 从字符串左侧的第一个字符开始寻找,查找出符合[radix]进制的值
- 把找到的内容,按照[radix]进制转换为10进制的数字
注意:一个都没找到就是NaN
- 遇到一个非有效数字字符,不论后面是否是有效数字字符,都不在查找了
parseInt('12px13',2); // 1
parseInt('10102px13',2); // 1010 => 10
特殊案例:
// JS遇到以0开始的“数字”,会默认将其按照8进制转为10进制,然后在进行其他操作
// 0013 = > 11
parseInt(0013,2); // 3
parseFloat([val],[radix]) 同parseInt,只是parseFloat可以多识别一个小数点
其它类型转换为字符串
String([val]) 转换规则:
- 若val是一个原始值,则转换结果直接包裹括号即可
- 若val是一个对象,转换规则同其它类型转数字
"+"出现字符串拼接的情况:
- "+"两边,一边是字符串
0 + ''; // '0'
- "+"两边,一边是对象
// 这个表达式不能理解
{} + 0; // 0
- "+"出现在值的左侧,该值会转换为数字
var d = '10a';
+d; // Number(d)
其他数据类型转换为布尔值
转换规则:
- 除0、NaN、空字符串、null、undefined返回的值是false外,其余都是true
"=="比较时的相互转换规则
两边数据类型不同,需要先转换为相同的类型,然后在进行比较 转换规则:
- 对象==字符串,对象转字符串【Symbol.toPrimitive -> valueOf -> toString】
- null == undefined
null == undefined; // true
- 对象==对象;比较的是内存地址,地址相同则相等
- NaN !== NaN true
NaN !== NaN; // true
Object.is(NaN,NaN); // true
- 除了以上情况,只要两边类型不一致,剩下的都是转换为数字,然后在进行比较
[] == false; // true 两边都转换为数字
![] == false; // true 先处理![] -> false false == false -> true
JS装箱和拆箱
装箱操作:把原始值变为非标准特殊对象
let num = 10
// num进行了装箱操作
// new Number(num)
console.log(num.toFixed(2)) //10.00
拆箱操作:把原始值变为把非标准特殊对象变为原始值
let num = new Number(10)
// num进行了拆箱操作
// 【Symbol.toPrimitive -> valueOf -> toString -> Number】
console.log(num+10) //20