数值

数值

进制

十进制:没有前导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返回InfinityInfinity减去或除以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-InfinityNaN这三个值会返回false,其他都返回true

console.log(isFinite(Infinity));    //false
console.log(isFinite(-Infinity));   //false
console.log(isFinite(NaN));         //false
console.log(isFinite(0));           //true

parseInt()

可以把字符串转化成整数。

parseInt()可以传递两个参数,第一个参数是要转换的字符串,第二个参数是要转换的进制。

parseFloat()

把字符串转换成浮点数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值