重新认识number类型
最近一直在看《你不知道的JS》,看到number
类型,觉得有些东西之前不清楚,轻总结了下。
number类型包括“整数”值和小数值。
但“整数”只是一个没有小数部分的小数值。
JS 没有真正的整数,也就是说,42.0 和 42 一样是“整数”
TL;DR
number
默认是十进制,并去掉末尾小数部分的0- 二进制、八进制、十六进制:以特殊的
0b 0o 0x
开头 - 非常大或者小的数,可以用指数表示:
5e10
- 严格控制小数的位数:
toFixed
,会四舍五入或补0 - 小数有误差,比较的时候,可以用容差
const isEqual = (n1,n2) => Math.abs( n1 - n2 ) < Number.EPSILON
- JS能表示的最大正负整数是有限的,15位数以内都是很安全的。ID超过15位的时候,记得用字符串。
NaN
是数字类型,但表示”非法数字“,且和自身不相等,但是Number.isNaN(NaN) === true
Infinity
和-Infinity
表示无穷,1/0 === Infinity
,1/InFinity === 0
十进制
默认情况下,大多数 number 将会以十进制小数的形式输出,并去掉末尾小数部分的 0
var a = 42.0; var b = 42.3000; a; // 42 b; // 42.3
其他进制的表示方式:尽量小写
- 二进制(0b):
0b11101
- 八进制(0o):
0o11101
- 十六进制(0x):
0x11101
推荐,用小写字母,这样易识别,虽然可以大写,但是0O
可读性低。
指数形式:5E5、toExponential
非常大或者非常小,可以用指数表示。
5E5
是一个number
类型,表示50000
,E表示为10的几次方。 但是toExponential
返回的是string
类型
// 5 * (10^5) var a = 5E5; a; // 500000 a.toExponential(); // "5e+10"
限制小数的位数:toFixed
当原来的小数位多于指定的位数,会四舍五入 当原来的小数位少于指定的位数,会补0
但注意,返回值是string
类型
var a = 42.59; a.toFixed( 0 ); // "43" a.toFixed( 1 ); // "42.6" a.toFixed( 3 ); // "42.590"
小数值:小数有误差,比较的时候一定慎重
JS里整数的计算是正确的,但是小数的计算是有误差的。
0.1 + 0.2 === 0.3 // false
JS 的 number 的实现基于“IEEE 754”标准,简单的说,就是小数的表示肯定有误差,只是误差极小。
如果相比较两个小数的话,需使用一个很小的“错误舍入”值作为比较的 容差。这个很小的值经常被称为“机械极小值(machine epsilon)”,大约是为 2^-52
:
function isEqual(n1,n2) { return Math.abs( n1 - n2 ) < Number.EPSILON; } isEqual(0.1+0.2,0.3) // true
安全的整数范围:15位数以下肯定是安全的
JS并不能表示任意位的整数,最大的整数是Number.MAX_SAFE_INTEGER
(9007199254740991),最小的整数是Number.MIN_SAFE_INTEGER
(-9007199254740991)
特别注意,很多ID是超出这个范围的,所以ID最好是用string
,当ID超出**15
**位数的话,就肯定要用字符串类型了。
那超出会怎么样呢,会不准滴!
var a = 9007199254740995 a; // 9007199254740996
测试是不是整数:Number.isInteger
这里我觉得有坑啦,比如希望用户输入整数,别用这个
因为xx.0
,有小数位,但是它觉得就是整数。
Number.isInteger( 42 ); // true Number.isInteger( 42.000 ); // true Number.isInteger( 42.3 ); // false
NaN:number类型,表示非正常的数字
NaN 是一种“哨兵值”(一个被赋予了特殊意义的普通的值),试着进行数学操作但是失败了,而这就是失败的 number 结果。
var a = 1/"foo" a; // NaN
注意:NaN,永远不等于自己。也是JS里唯一自己不等于自己的。
NaN === NaN // false
判断是不是NaN:Number.isNaN
Number.isNaN(1/'foo') // true Object.is(NaN,NaN) // true
Infinity:表示无穷
数学里,0是不允许做除数的!!!
但是JS里,任意非0的数除以0,值是Infinity
而任意非0的数除以Infinity
,都是0
或者-0
1/0 // Infinity -1/0 // -Infinity 1/Infinity // 0 -1/Infinity // -0 0 === -0 // true Object.is(0,-0) // false
虽然-0 === 0
但Object.is(0,-0)是false
,也就是这两并不完全等价,-0
有其本身的意义,比如做动画的时候,表示移动的方向。 不过我觉得大部分开发者,可以忽略,=。=
Object.is很大程度上是为这些特殊的等价情况准备的,0和-0,NaN和NaN。
其他属性和方法
MDN关于Number的介绍。
Number本身也值得一说,其是个函数
- 单独调用,表示将参数转化成数字,无法转化则返回
NaN
- 作为构造函数调用,创建
number
类型的对象 - 作为对象,有其属性和方法