Number方法小结

276 阅读3分钟

每天做个总结吧,坚持就是胜利!

    /**
        @date 2021-06-22
        @description Number方法小结
    */

壹(序)

Number是JS的一种基本数据类型,用来表示数字,JS中没有IntFloat之分,全都使用Nunber表示;

Number最大安全数字只能表示到2**53 - 1,可以使用Number.MAX_SAFE_INTEGER获取,ES2020引入了BigInt,可以表示更高的整数,关于BigInt可以看这

Number的声明有两种方式:

  1. 字面量
const num = 18;
  1. 构造函数,使用valueOf方法获取原始值
const numObj = new Number(18);
const num = numObj.valueOf(); // 18

贰(常见方法)

公共代码:

const num = 18, str = '18';
  1. 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
  1. 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
  );
}
  1. 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
  1. 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
  1. 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
  1. 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'
  1. 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'
  1. toString:返回字符串形式,可参考方法大总结
  2. toValue:返回原始值,主要用于返回Number对象的原始值
const numObj = new Number(18);
const numValue = numObj.valueOf(); // 18