一.前篇补充
BigInt
BigInt也是一种数据类型。
eg:BigInt("10"),结果10n,用typeof 10n结果为bigInt类型
undefined 与null与NaN的区别
undefined(未定义)是已声明,未赋值,如var a;
null(空值)是已声明,且赋值为null,如,var a=null;。常用来清空变量以预防内存泄漏等问题。
NaN(表示不合法的数),NaN和任何数据类型都不相等,包括NaN本身,其他数据类型和NaN运算的结果都是NaN。如undefined +1为NaN。表示不合法的数字。可以通过isNaN()来判断某个值是否为数,是否合法。
无穷数
Infinity和-Infinity
Infinity 正无穷比任何有限数都大
-Infinity 负无穷比任何有限数都小
二.数据类型转换
显示转换/强制转换
通过人工进行干预的情况下,对数据类型进行转换的方法。比如像之前提到的bigInt("10")就是把字符串强制转换为bigInt类型
强转为数字类型
Number([val])
0.数组 Number([]),空数组强转数字为0,Number([1])为1,如果数组有多个元素,为NaN因为不合法
1.字符串转数字类型:空字符串强转为数字类型为0,如果是有效数字字符串则强转为数字类型为对应的数字,如Number("1234")结果为1234,如果出现的是任何非有效数字字符串,结果都是NaN
2.布尔值强转换为数字类型:如果是true为1,false 为0。
3. null强转为数字类型为0。
4.undefined 强转为数字类型为NaN
5.Symbol无法强转为数字类型,报错:Uncaught TypeError: Cannot convert a Symbol value to a number
6.bigInt强转为数字类型去除n就好
7.对象强转为数字类型,首先调用对象的Symbol.toPrimitive如果没有返回值,再调用Valueof没有返回值,再调用toString(注意普通对象Valueof返回它本身,就是引用类型,没有原始值)
如: var a = {} a[Symbol.toPrimitive]为undefined继续调用a.valueof()返回空对象,再调用a.toString()返回值为'[ObjectObject]',而'[ObjectObject]'强转为Number为NaN,因为字符串强转为数字类型看是否为数字字符。
如果有返回值看下列图:
8.函数可视为对象,按对象处理
parseInt([val],[radix])
其中[val]必须为字符串,如果不是先隐式转换为字符串[通过String[val]转换。
[radix]进制 ,如果不写,或者0,默认是10进制[特殊情况:如果字符串是以0x开始的,默认是16进制]
有效范围也:2~36之间,如果不在这个区间,结果直接是NaN
val 值如果第一个字符不是数字字符则结果为NaN,如果是数字字符和非数字字符则截断非数字字符,然后按照[radix]转换为10进制
强转为字符串
String([val])
绝大多数情况下String底层使用的时候会调用[val]的toString()方法,但是针对null/undefined等String()会有特殊的处理。可以视为一种安全的字符串转换方案。当然也可以通过重写某一变量的toString()方法,使String方法变成我们自己想实现的功能。
String([val])的结果除了可以是字符串,也是是别的类型;val.toString()的结果只能是字符串
1.若val是一个原始值则直接强转为字符串。
2.若Val是一个对象,则按照Symbol.toprimitive没有返回值,则调用toString方法
空数组的toString()方法为空字符串
空对象的toString()为'[ObjectObject]'
ob = {}空对象时, ob.valueof是本身
Ob={}空对象时, ob.toString() 是{‘objectobject’}
强转为布尔值
Boolean([val])
除0,null,undefined,false ,NaN,空字符串的返回值为false,其余都为true,尤其要注意空对象和空数组也是true