每天做个总结吧,坚持就是胜利!
/**
@date 2021-06-22
@description Number方法小结
*/
壹(序)
Number是JS的一种基本数据类型,用来表示数字,JS中没有Int和Float之分,全都使用Nunber表示;
Number的最大安全数字只能表示到2**53 - 1,可以使用Number.MAX_SAFE_INTEGER获取,ES2020引入了BigInt,可以表示更高的整数,关于BigInt可以看这。
Number的声明有两种方式:
- 字面量
const num = 18;
- 构造函数,使用valueOf方法获取原始值
const numObj = new Number(18);
const num = numObj.valueOf(); // 18
贰(常见方法)
公共代码:
const num = 18, str = '18';
- isFinite: 判断是否是一个有限数字,需注意的是,globalThis上也有一个isFinite方法,但全局的会进行隐式转换,而Number.isFinite不会
globalThis.isFinite(str); // true
Number.isFinite(str); // false
Number.isFinite(num); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite(2 ** 53); // true
- isInteger:判断传入值是否是一个整数
Number.isInteger(18); // true
Number.isInteger(18.0); // true
Number.isInteger(18.1); // false
// polyfill
function isInteger(val) {
return (
typeof val === 'number' && Number.isFinite(val) && Math.round(val) === val
);
}
- isNaN:判断传入值是不是NaN,注意全局也有一个isNaN,但是全局的方法会进行隐式转换
Number.isNaN('NaN'); // false
globalThis.isNaN('NaN'); // true
Number.isNaN(undefined); // false
globalThis.isNaN(undefined); // true
Number.isNaN({}); // false
globalThis.isNaN({}); // true
Number.isNaN(NaN); // true
Number.isNaN(1 / 0); // false
Number.isNaN(0 / 0); // false
- isSafeInterger:判断传入值是否是一个安全整数,区间
[-(2 ** 53 - 1), 2 ** 53 - 1]的整数是安全整数
Number.isSafeInteger(2 ** 53 - 1); // true
Number.isSafeInteger(2 ** 53); // false
Number.isSafeInteger(-(2 ** 53 - 1)); // true
Number.isSafeInteger(-(2 ** 53)); // false
Number.isSafeInteger(NaN); // false
Number.isSafeInteger(Infinity); // false
- parseFloat:与全局的parseFloat相同,将传入值转换为浮点数,需注意特殊的字符串如1.23test,1.23.45,会截取前面可转换部分进行转换,如果传入的不是String类型,还会转换为String再进行转换
Number.parseFloat('1.23'); // 1.23
Number.parseFloat('1.23test'); // 1.23
Number.parseFloat('1.23.34'); // 1.23
Number.parseFloat([1.23]); // 1.23
Number.parseFloat([1.23, 2.34]); // 1.23
Number.parseFloat({num: 1.23}); // NaN
Number.parseFloat('2e3'); // 2000
Number.parseFloat('2e3n'); // 2000
- parseInt:与全局的parseInt方法相同,除了传入需要转换的值外,还能传入需要按照几进制进行转换(可选,范围在2-36之间,超过则返回NaN,默认为并不是10),不会处理科学计数法的字符串
Number.parseInt('1.23'); // 1
Number.parseInt('1.23test'); // 1
Number.parseInt('1.23.34'); // 1
Number.parseInt([1.23]); // 1
Number.parseInt([1.23, 2.34]); // 1
Number.parseInt({num: 1.23}); // NaN
Number.parseInt('2e3'); // 2
Number.parseInt('2e3n'); // 2
Number.parseInt(2e3); // 2000
Number.parseInt('10', 37); // NaN
关于第二个参数radix不传或传入undefined或0有以下三种情况:
a. 字符串以'0x'或'0X'开头,则以16进制进行转换
Number.parseInt('0X10'); // 16
Number.parseInt('0X10', 0); // 16
Number.parseInt('0X10', 10); // 0
b. 字符串以'0'开头,部分浏览器以8进制转换,部分浏览器以10进制转换,规范应该是以10进制进行转换
c. 其他情况,以10进制进行转换
7. toFixed:将数字转换为小数点形式,返回一个字符串,可传入小数点个数,默认为0,范围大部分为[0-100],传入浮点数则向下取整再转换
num.toFixed(); // '18'
// 小数点位数不够以0补全
num.toFixed(2); // '18.00'
// 小数点位数足够时,根据传入的参数截取,会进行四舍五入
(18.1234).toFixed(2); // '18.12'
(18.1256).toFixed(2); // '18.13'
// 传入浮点数
(18.1256).toFixed(2.634); // '18.13'
- toPrecision:返回指定精度的字符串形式,精度范围在[1-100],不传则类似于toString方法,传入浮点数则向下取整再转换
num.toPrecision(); // '18'
// 精度位数不够以0补全
num.toPrecision(4); // '18.00'
// 数字精度不够则四舍五入
num.toPrecision(1); // '2e+1'
// 位数足够时,根据传入的参数截取,会进行四舍五入
(18.1234).toPrecision(3); // '18.1'
(18.1534).toPrecision(3); // '18.2'
// 传入浮点数
(18.1256).toPrecision(2.634); // '18'
- toString:返回字符串形式,可参考方法大总结
- toValue:返回原始值,主要用于返回Number对象的原始值
const numObj = new Number(18);
const numValue = numObj.valueOf(); // 18