这是我参与8月更文挑战的第四天,活动详情查看:8月更文挑战
数据类型
ECMAScript有六种简单数据类型:Number,String,Boolean,Null,Undefined和Symbol。其中Symbol是ES6新增的。
Number类型
Number类型使用IEEE754格式表示整数和浮点值。由于存储浮点值的内存空间是存储整数值的两倍,所以ECMAScirpt总是尽可能的把值转换为整数进行处理。
1.浮点值
let floatNum1 = 0.8;
let floatNum2 = 1.8;
let floatNum3 = .8;//有效,但不推荐
复制代码
关于浮点数,有一道非常经典的面试题,就是在js中0.1+0.2==0.3是否成立?
答案是不成立的。因为使用IEEE754数值,所以在浮点数的计算上,存在失去精度的现象,所以永远不要测试某个特定的浮点值,要尽可能的转换为整数进行计算。
2.值的范围
如果计算的数值结果超过了js可以表示的范围,那么这个数值将会自动转换成一个特殊的Infinity值。任何无法表示的负值以-Infinity表示,任何无法表示的正值以Infinity表示。要确定一个值是不是有限大,可以使用函数isFinite()进行判断。
3.NaN
有一个特殊的数值NaN,意思是“不是数值”(Not a Number),用于表示本来要返回数值的操作失败了。例如:
console.log(0/0);//这里会打印NaN
复制代码
NaN有几个独特的特性。首先NaN不等于自身。其次,任何涉及NaN的操作都会返回NaN。因此,存在一个函数isNaN()。该函数接收一个参数,并且会尝试将这个参数转换为数值,如果可以转换为数值,那么返回false,如果不能转换为数值,那么返回true。
4.数值转换
有三个函数可以将非数值转换为数值:Number(),parseInt(),parseFloat()。Number()是转型函数,可以用于任何数据类型。而parseInt()和parseFloat()主要用于将字符串转为数值。
对于Number()函数,有着以下的转型规则:
- Boolean类型:true返回1,false返回0;
- Number类型:直接返回;
- Null类型:返回0;
- Undefined类型:返回NaN;
- String类型:空字符串返回0;含数值字符串会返回十进制的数值;其他情况返回NaN
- Object类型:先调用valueof()方法,然后照上面的规则返回,如果是NaN,那么调用toString()方法,再按照字符串规则转换。
parseInt()函数则更关注于字符串是否包含数值模式。如果第一个字符是数值字符、加号或减号,则继续依次检测每个字符,直到字符串末尾,或碰到非数值字符。如果不是,那么立即返回NaN。
并且它可以接受第二个参数,用于指定底数(进制数),
例如:
console.log(parseInt("2021juejin")); //2021
console.log(parseInt("")); //NaN
console.log(parseInt("0XA")); //10,十六进制整数
console.log(parseInt("20.21juejin")); //20
console.log(parseInt("2021")); //2021
console.log(parseInt("AB",16)); //171
console.log(parseInt("AB")); //NaN
console.log(parseInt("10",2)); //2
console.log(parseInt("10",8)); //8
console.log(parseInt("10",10)); //10
console.log(parseInt("10",16)); //16
复制代码
parseFloat()函数会始终忽略字符串开头的0,并且解析到字符串末尾或者一个无效的浮点数值字符为止。并且parseFloat()函数只接受一个参数,只按照十进制进行解析。例如:
console.log(parseFloat("2021juejin")); //2021
console.log(parseFloat("")); //NaN
console.log(parseFloat("0XA")); //0
console.log(parseFloat("20.21.juejin"));//20.21
console.log(parseFloat("0.2.1")); //0.2
console.log(parseFloat("AB")); //NaN
复制代码