数值
进制
十进制:没有前导0的数值。
八进制:有前缀0o或0O的数值,或者有前导0且只用到0-7的八个阿拉伯数字的数值。
十六进制:有前缀0X或0x的数值。
二进制:有前缀0B或0b的数值。
默认情况下,JS内部会自动将八进制、十六进制、二进制转为十进制。
console.log(0xff); //255
console.log(0b10); //2
-
十六进制
- 数字序列范围:0~9以及A~F(一般以0x开头)
var num1 = 0xa;
console.log(num1); //10 对应十进制的10
前导0的数值会被视为八进制,但是如果前导0后面有数字8或9,该数值将被当作十进制数值解析。这种表示方法很容易造成混乱,ES5的严格模式和ES6都已废除这种表示法,但是浏览器为了兼容以前的代码,目前还支持这种表示方法。
var num1 = 07;
console.log(num1); //7
var num2 = 0123;
console.log(num2); //83
var num3 = 019;
console.log(num3); //19
如果二进制、八进制、十六进制的数值里出现了不属于该进制的数字,就会报错。
console.log(0b34); //报错
console.log(0o89); //报错
console.log(0xgj); //报错
整数和浮点数
JS内部,所有数字都是以64位浮点数形式存储,即使整数也是如此。也就是说,JS底层根本没有整数,所有数字都是小数(64位浮点数)。位运算只有整数才能完成,此时JS会自动把64位浮点数转换成32位整数,然后再进行运算。
科学计数法:
xe+y
表示x乘以10的y次方,e 表示 exponent
var n1 = 5e+4;
console.log(n1); //50000
var n2 = 8e+3;
var n3 = 7e-2;
以下两种情况,JS会自动将数值转为科学计数法表示,其他情况都采用字面形式直接表示:
(1)小数点前的数字多余21位。
console.log(1234567890123456789012); //1.2345678901234568e+21
(2)小数点后的零多于5个
console.log(0.0000001); //1e-7
console.log(0.000001); //0.000001
当小数点前的数字多余18位时,18位之后的数字都转为0
console.log(123456789012345678901); //123456789012345680000
console.log(123456789012345678901.1); //123456789012345680000
浮点数在计算时,精度远远不如整数。
通常把浮点数转换为整数之后再进行计算。
不要判断两个浮点数是否相等。
console.log(0.1 + 0.2); //0.30000000000000004
console.log(0.07 * 100); //7.000000000000001
数值范围
由于内存的限制,ECMAScript并不能保存所有的值。
最小值:Number.MIN_VALUE
console.log(Number.MIN_VALUE); //5e-324
console.log(5e-325); //0 比最小值再小一点的数就是0了
最大值:Number.MAX_VALUE
console.log(Number.MAX_VALUE); //1.7976931348623157e+308
console.log(1.8e+308); //Infinity 比最大值还大的数为Infinity,正无穷
特殊数值
JS提供了几个特殊的数值。
正零和负零
因为JS的64位浮点数之中,有一个二进制位是符号位。意味着任何一个数都有一个对应的负值,0也不例外。所以JS内部实际存在2个0,一个是+0,一个是-0,区别就是64位浮点数表示法的符号位不同。但它们是等价的。
console.log(-0 === +0); //true
console.log(0 === -0); //true
console.log(0 === +0); //true
几乎所有场合正零和负零都会被当成正常的0,唯一有区别的是+0和-0当做分母的时候,返回值是不相等的。
console.log(1 / -0); //-Infinity
console.log(1 / +0); //Infinity
console.log(-1 / 0 === 1 / 0); //false
NaN
出现场景
NaN 非数值(not a number)。主要出现在将字符串解析成数字出错的场合。
console.log('abc' / 10); //NaN
一些数学函数的运算结果也会出现NaN
console.log(Math.sqrt(-1)); //NaN 平方根,里面的数值不能为负数
console.log(Math.log(-1)); //NaN 返回一个数的自然对数,里面的数值不能为负数
console.log(Math.acos(2)); //NaN 反余弦值,里面的数值在-1到1之间
0除以0也会得到NaN。
console.log(0 / 0); //NaN
相关运算
NaN 与任何值都不相等,包括 NaN 本身。
console.log(NaN == NaN); //false
它的数据类型依然是number
console.log(typeof (NaN)); //'number'
转换成布尔值为false
console.log(Boolean(NaN)); //false
Infinity
无穷。Infinity
表示正的无穷-Infinity
表示负的无穷。
出现场景
(1)比最大值还大的数,超出了能够表示的范围,返回Infinity
(2)非0数值除以0(0除以0得到NaN)
运算规则
(1)普通四则运算
console.log(1 * Infinity); //Infinity
console.log(1 - Infinity); //-Infinity
console.log(Infinity / 1); //Infinity
console.log(1 / Infinity); //0
console.log(-1 / Infinity); //-0
与0的运算:乘以0返回NaN,除以0返回Infinity,0除以Infinity返回0。
console.log(0 * Infinity); //NaN
console.log(0 / Infinity); //0
console.log(Infinity / 0); //Infinity
自身运算:Infinity
加上或乘以Infinity
返回Infinity
。Infinity
减去或除以Infinity
,得到NaN
console.log(Infinity / Infinity); //NaN
console.log(Infinity - Infinity); //NaN
与null运算:null会转为0,等同于与0的计算。
与undefined运算:全部返回NaN
与数值相关的全局方法
数值检测isNaN()
任何不能转换为数值的值,都会导致这个函数返回true。能转换为数值的值,就会导致这个函数返回false。数据类型转换
console.log(isNaN(NaN)); //true
console.log(isNaN(123)); //false
console.log(isNaN([])); //false
console.log(isNaN(['123'])); //false
因此使用isNaN
之前,最好先判断一下数据类型。
function myIsNaN(value) {
return typeof value === 'number' && isNaN(value);
}
isFinite()
判断某个值是否为正常的数值。
除了Infinity
、-Infinity
和NaN
这三个值会返回false
,其他都返回true
console.log(isFinite(Infinity)); //false
console.log(isFinite(-Infinity)); //false
console.log(isFinite(NaN)); //false
console.log(isFinite(0)); //true
parseInt()
parseInt()可以传递两个参数,第一个参数是要转换的字符串,第二个参数是要转换的进制。