JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有七种。
数值
、字符串
、布尔值
这三种是原始类型。对象
则称为合成类型。undefined
和null
,为两个特殊值。ES6 添加了Symbol
类型的值。
一.概念
1.整数和浮点数
-
在JavaScript 内部,所有数值都以64位浮点数形式储存,包括整数和浮点数
1 === 1.0 // true
-
浮点数比较运算就会出现偏差
0.1 + 0.2 === 0.3 // false 0.3 / 0.1 // 2.9999999999999996 (0.3 - 0.2) === (0.2 - 0.1) // false
-
数值构成
- 第1位:符号位,0表示正数,1表示负数
- 第2位到第12位(共11位):指数部分
- 第13位到第64位(共52位):小数部分(即有效数字)
-
符号位决定了一个数的正负,指数部分决定了数值的大小,小数部分决定了数值的精度
2.数值的精度和范围
-
数值精度,即-2的53次方到2的53次方,超出此精度则运算出现问题,支持最大的正整数
Math.pow(2, 53) // 9007199254740992 最大整数 // 多出的三个有效数字,将无法保存 9007199254740992111 // 9007199254740992000
-
数值范围,既2的1024到2的-1023之间,超出此数字范围则无法表示;数字大于2的1024次方,出现"正向溢出",返回
Infinity
;一个数小于等于2的-1075次方,“负向溢出”,返回0
; -
Number.MAX_VALUE返回最大值,Number.MIN_VALUE返回最小值
Math.pow(2, 1024) // Infinity Math.pow(2, -1075) // 0 Number.MAX_VALUE // 1.7976931348623157e+308 Number.MIN_VALUE // 5e-324
二.数值的表示
1.科学计数
-
使用’e’或者’E’表示位数
123e3 // 123000 123e-3 // 0.123 -3.1E+12//-3100000000000 .1e-5//0.000001
-
JavaScript 会自动将数值转为科学计数法情况
- 小数点前的数字多于21位
1234567890123456789012 // 1.2345678901234568e+21 123456789012345678901 // 123456789012345680000
- 小数点后的零多于5个
// 小数点后紧跟5个以上的零, // 就自动转为科学计数法 0.0000003 // 3e-7 // 否则,就保持原来的字面形式 0.000003 // 0.000003
2.进制表示
- 十进制:没有前导0的数值。
- 八进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
- 十六进制:有前缀0x或0X的数值。
- 二进制:有前缀0b或0B的数值
三. 特殊数值
1.正零和负零
-
+0
,-0
都是0
,没有区别,唯一区别是计算时做分母-0 === +0 // true 0 === -0 // true 0 === +0 // true (1 / +0) === (1 / -0) // false //(1 / +0)取值为+Infinity,(1 / -0)取值为-Infinity
2.NaN
-
NaN
是 JavaScript 的特殊值,表示“非数字”(Not a Number),如下情况出现NaN//1.在运算时会转换为数字,转换失败 5 - 'x' // NaN 'x' //2.一些数学函数的运算结果会出现NaN Math.acos(2) // NaN Math.log(-1) // NaN Math.sqrt(-1) // NaN //3.0除以0也会得到NaN 0 / 0 // NaN
-
特点:①.NaN不等于任何值,包括它本身;②.NaN在布尔运算时被当作false;③.NaN与任何数(包括它自己)的运算,得到的都是NaN;④.数组的indexOf方法内部使用的是严格相等运算符,所以该方法对NaN不成立。具体示例如下:
NaN === NaN // false Boolean(NaN) // false NaN + 32 // NaN [NaN].indexOf(NaN) // -1
3.Infinity
Infinity
表示无穷(出现情况:正值太大,负值太小,非0数值除以0)// 场景一 Math.pow(2, 1024) // Infinity // 场景二 0 / 0 // NaN 1 / 0 // Infinity
Infinity
有正负之分,Infinity正无穷,-Infinity负无穷Infinity === -Infinity // false 1 / -0 // -Infinity -1 / -0 // Infinity
四. 与数值相关的方法
1.parseInt()
-
parseInt() 将字符串转换为整数;非字符串数据,先转换为字符串再转换为整数。
//1 parseInt('123') // 123 //2. 自动去除空格 parseInt(' 81') // 81 //3. 非字符串,转换字符串再转为整数 parseInt(1.23) // 1 // 等同于 parseInt('1.23') // 1 //4.字符串转为整数,一个一个字符转换,遇到不能转换字符返回 parseInt('8a') // 8 parseInt('12**') // 12 //5.除 + -号外,其余的第一个数字不能转换则返回NaN parseInt('abc') // NaN parseInt('+1') // 1
-
parseInt() 也可进行进制转换,第二个数字代表输入的进制,转换为10进制输出
//二进制、六进制、八进制的1000,分别等于十进制的8、216和512 parseInt('1000') // 1000 // 等同于 parseInt('1000', 10) // 1000 parseInt('1000', 2) // 8 parseInt('1000', 6) // 216 parseInt('1000', 8) // 512
2.parseFloat()
- parseFloat() 将字符串转换为浮点数,表现出此情况与parseInt基本相同,但是没有进制转换。
3.isNaN()
-
isNaN方法可以用来判断一个值是否为NaN;isNaN只对数值有效,如果传入其他值,会使用Number()先转成数值
//1 isNaN(NaN) // true isNaN(123) // false //2 isNaN('Hello') // true // 相当于 isNaN(Number('Hello')) // true //3 isNaN({}) // true // 等同于 isNaN(Number({})) // true //如下数组中为字符串 isNaN(['xzy']) // true // 等同于 isNaN(Number(['xzy'])) // true //4.对于空数组和只有一个数值成员的数组,isNaN返回false isNaN([]) // false isNaN([123]) // false isNaN(['123']) // false
4.isFinite()
-
isFinite方法返回一个布尔值,表示某个值是否为正常的数值;除了Infinity、-Infinity、NaN和undefined这几个值会返回false,isFinite对于其他的数值都会返回true
isFinite(Infinity) // false isFinite(-Infinity) // false isFinite(NaN) // false isFinite(undefined) // false isFinite(null) // true isFinite(-1) // true