目录
数值的扩展
1. 二进制和八进制
2. 数字类型判断
Number.isFinite(), Number.isNaN()
Number.isFinite()
Number.isNaN()
3. Number.isInteger() (判断是否整数)
4. Number.parseInt(), Number.parseFloat()
5. 新增常量
5.1 极小的常量 Number.EPSILON
5.2. 安全整数范围 Number.isSafeInteger()
1、二进制数字开头0b,八进制数字开头0o 2、更靠谱的类型判断有效数字,NaN,以及整数(es6新增); 3、增加了一个极小的常量,用于判断浮点数计算,结果的误差小于这个常量则基本可以认为相等; 4、增加了安全范围的最大整数和最小整数常量,以及对他们的判断; 5、新增方法全部不会进行隐式转换;
二进制新的写法,用前缀0b(或0B)
八进制新的写法 , 用前缀0o ( 0O )
Number(0b11) // 二进制转换成十进制等于 3 Number(0o11) // 八进制转换成十进制等于 9 // ES5转换 parseInt(11,2) //3 parseInt(11,8) //9 var a = 2; a.toString(2); //"10"这里是将数字转为二进制字符串1. 准确的说,只有当一个数字是合法数字(非NaN,非Infinity正无穷,必须是number类型)才会返回true。
示例 :
Number.isFinite(15); // true Number.isFinite(0.8); // true Number.isFinite(NaN); // false Number.isFinite(Infinity); // false Number.isFinite(-Infinity); // false Number.isFinite('foo'); // false Number.isFinite('15'); // 不会被隐式转换, false Number.isFinite(true); // 不会被隐式转换, false var test = {}; test.toString = function () { return 1; } Number.isFinite(test); // 不会被隐式转换, false和传统的全局方法isFinite()的区别在于,传统方法先调用Number()将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,
isFinite("1"); //会被隐式转换,true isFinite([1]); //也会被隐式转换,true var test = {}; test.toString = function () { return 1; } isFinite(test); //会被隐式转换,true1. 和上面类似,只对NaN生效。
示例 :
Number.isNaN(NaN) // true Number.isNaN(15) // false Number.isNaN('15') // false Number.isNaN(true) // false Number.isNaN(9/NaN) // true Number.isNaN('true' / 0) // true Number.isNaN('true' / 'true') // true Number.isNaN('NaN') // 不会被隐式转换, false var test = {}; test.toString = function () { return NaN; } Number.isNaN(test); //不会被隐式转换,false对比全局的isNaN()
isNaN("NaN"); //会被隐式转换,true isNaN("NaNabcdef"); //会被隐式转换,true var test = {}; test.toString = function () { return NaN; } isNaN(test); //会被隐式转换,true总结: 简单来说,没有Number开头的方法,会先将参数通过Number()隐式转换为数字后,再去判断。(对象会先调用Object.toString()方法转换为字符串) 而通过Number对象来调用的这两个方法,不会进行隐式转换,因此更准确。
1. 判断一个数值是否为整数
2. JavaScript 内部,整数和浮点数采用的是同样的储存方法 , 浮点数如果小数部分为0,例如1.000,也会被视为整数
Number.isInteger(1); //true Number.isInteger(1.00); //视为1,true Number.isInteger(-1.0); //整数,true Number.isInteger(1.01); //非整数,false Number.isInteger(true); //不会隐式转换,false Number.isInteger('1'); //不会隐式转换,false Number.isInteger(Infinity); //正无穷不算是整数,false var test = {}; test.toString = function () { return 1; } Number.isInteger(test); //不会被隐式转换,false1. 简单说就是把全局方法移植到 Number 对象上面, 使用完全一样。
2. 目的是 逐步减少全局性方法,使得语言逐步模块化
// ES5的写法 parseInt('12.34') // 12 parseFloat('123.45#') // 123.45 // ES6的写法 Number.parseInt('12.34') // 12 Number.parseFloat('123.45#') // 123.45 Number.parseInt === parseInt // true Number.parseFloat === parseFloat // true目的用于浮点误差判断
它的值是
Number.EPSILON === Math.pow(2, -52) // true 2的负52次方 Number.EPSILON // 2.220446049250313e-16 Number.EPSILON.toFixed(20) // "0.00000000000000022204"在于为浮点数计算,设置一个误差范围。我们知道浮点数计算是不精确的。(不仅JavaScript,所有遵循IEEE 754规范的语言都是如此)
s6的解决办法是引入一个误差常量,在计算浮点数时,用于进行判断误差。
具体来说,假如a-b的绝对值,小于这个常量,一般情况下就可以认为a==b,如代码:
0.1 + 0.2 // 0.30000000000000004 0.1 + 0.2 - 0.3 // 5.551115123125783e-17 0.1+0.2-0.3 < Number.EPSILON; //true阮一峰封装的误差检测函数:(判断两个值是否相等)
//判断两个数是否相等(误差低于一定范围) function withinErrorMargin(left, right) { //Math.abs的效果是返回绝对值(因为负数必然小于这个常量) return Math.abs(left - right) < (Number.EPSILON || Math.pow(2, -52)); // 兼容处理 } withinErrorMargin(0.1+0.2, 0.3); //trueJavaScript 能够准确表示的整数范围在-2^53到2^53之间(不含两个端点),超过这个范围,无法精确表示这个值。
Number.MAX_SAFE_INTEGER 最大的安全整数
其值为2的53次方-1,值为9007199254740991
Number.MIN_SAFE_INTEGER 最小的安全整数
其值为2的53次方+1,值为-9007199254740991
检查一个数字是否是安全整数,可以通过以下方法来判断
Number.isSafeInteger(变量)
Number.isSafeInteger(1); //true Number.isSafeInteger(Number.MAX_SAFE_INTEGER); //true Number.isSafeInteger(Number.MAX_SAFE_INTEGER - 1); //true Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1); //超出范围,false Number.isSafeInteger(1.1); //浮点数显然不是整数,更别说是安全整数了,false Number.isSafeInteger(1.0); //视为整数,true Number.isSafeInteger('1'); //不会隐式转换,false