Js中Number对象

JavaScriptNumber对象是经过封装从而能够处理数字值的对象,Number对象由Number()构造器以及字面量声明的值在转化为包装对象时创建,JavaScriptNumber类型为双精度IEEE 754 64位浮点类型。

描述

创建一个数字可以通过字面量的方式,通过字面量创建的数字变量在调用方法的时候能够自动转化为临时的包装对象,从而能够调用其构造函数的原型中的方法,也可以利用Number对象生成数值对象,JavaScriptNumber类型为双精度IEEE 754 64位浮点类型,如果是索引数字例如Array.length则是32位单精度,此外当JavaScript遇到一个数值时,其会首先尝试按整数处理数值,如果可以作为整数处理就使用有符号32位整型处理,如果数值不能作为整数或者超出有符号整型范围,就把数值保存为64位的IEEE 754浮点数。

var a = 1;
var b = Number("1");
var c = new Number("1");
console.log(a); // 1
console.log(b); // 1
console.log(c); // Number {1}
console.log(a instanceof Number); // false
console.log(b instanceof Number); // false
console.log(c instanceof Number); // true
var arr = new Array(Math.pow(2,32)-1); // 4294967295 // [0 - 4294967294]
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
console.log(Number("a")); // NaN // NaN !== NaN
console.log(Number("1.1")); // 1.1
console.log(Number("0x11")); // 17
console.log(Number("0b11")); // 3
console.log(Number("0o11"));  // 9
console.log(Number("Infinity")); // Infinity

属性

  • Number.EPSILON: 两个可表示representable数之间的最小间隔。
  • Number.MAX_SAFE_INTEGER: JavaScript中最大的安全整数2^53 - 1
  • Number.MAX_VALUE: 能表示的最大正数,最小的负数是-MAX_VALUE
  • Number.MIN_SAFE_INTEGER: JavaScript中最小的安全整数-(2^53 - 1).
  • Number.MIN_VALUE: 能表示的最小正数即最接近0的正数,实际上不会变成0,最大的负数是-MIN_VALUE
  • Number.NaN: 特殊的非数字值。
  • Number.NEGATIVE_INFINITY: 特殊的负无穷大值,在溢出时返回该值。
  • Number.POSITIVE_INFINITY: 特殊的正无穷大值,在溢出时返回该值。
  • Number.prototype: Number对象上允许的额外属性。

方法

Number.isNaN()

Number.isNaN(value)
Number.isNaN()方法确定传递的值是否为NaN,并且检查其类型是否为Number,其是原来的全局isNaN()的更稳妥的版本。

console.log(Number.isNaN(NaN)); // true // NaN !== NaN
console.log(Number.isNaN(Number("1"))); // false
console.log(Number.isNaN(Number("a"))); // true

Number.isFinite()

Number.isFinite(value)
Number.isFinite()方法用来检测传入的参数是否是一个有穷数。

console.log(Number.isFinite(NaN)); // false
console.log(Number.isFinite("1")); // false // 全局方法 isFinite("1") 返回 true
console.log(Number.isFinite(1 / 0)); // false
console.log(Number.isFinite(0 / 0)); // false
console.log(Number.isFinite(0.1 + 0.1)); // true
console.log(Number.isFinite(Infinity)); // false

Number.isInteger()

Number.isInteger(value)
Number.isInteger()方法用来判断给定的参数是否为整数。

console.log(Number.isInteger(NaN)); // false
console.log(Number.isInteger("1")); // false 
console.log(Number.isInteger(1)); // true

Number.isSafeInteger()

Number.isSafeInteger(testValue)
Number.isSafeInteger()方法用来判断传入的参数值是否是一个安全整数safe integer。一个安全整数是一个符合下面条件的整数:

  • 可以准确地表示为一个IEEE-754双精度数字。
  • IEEE-754表示不能是舍入任何其他整数以适应IEEE-754表示的结果。

例如,2^53 - 1是一个安全整数,它能被精确表示,在任何IEEE-754舍入模式rounding mode下,没有其他整数舍入结果为该整数。作为对比,2^53就不是一个安全整数,它能够使用IEEE-754表示,但是2^53 + 1不能使用IEEE-754直接表示,在就近舍入round-to-nearest和向零舍入中,会被舍入为 2^53。安全整数范围为-(2^53 - 1)2^53 - 1之间的整数,包含-(2^53 - 1)2^53 - 1

console.log(Number.isSafeInteger(NaN)); // false
console.log(Number.isSafeInteger(1)); // true 
console.log(Number.isSafeInteger(1.1)); // false 
console.log(Number.isSafeInteger("1")); // false 
console.log(Number.isSafeInteger(Math.pow(2, 53))); // false 
console.log(Number.isSafeInteger(Math.pow(2, 53) - 1)); // true 
console.log(Number.isSafeInteger(Infinity)); // false

Number.parseFloat()

Number.parseFloat(string)
Number.parseFloat()方法可以把一个字符串解析成浮点数,如果无法被解析成浮点数,则返回NaN,该方法与全局的parseFloat()函数相同,并且处于ECMAScript 6规范中,用于全局变量的模块化。

console.log(Number.parseFloat(NaN)); // NaN
console.log(Number.parseFloat("1.1")); // 1.1 
console.log(Number.parseFloat(Infinity)); // Infinity

Number.parseInt()

Number.parseInt(string[, radix])
Number.parseInt()方法依据指定基数即参数radix的值,把字符串解析成整数,如果无法被解析成整数,则返回NaN,该方法与全局的parseInt()函数相同,并且处于ECMAScript 6规范中,用于全局变量的模块化。

console.log(Number.parseInt(NaN)); // NaN
console.log(Number.parseInt("1.1")); // 1
console.log(Number.parseInt("11")); // 11
console.log(Number.parseInt("11", 2)); // 3
console.log(Number.parseInt("11", 3)); // 4
console.log(Number.parseInt("11", 8)); // 9
console.log(Number.parseInt("11", 16)); // 17
console.log(Number.parseInt(Infinity)); // NaN

Number.prototype.toExponential()

numObj.toExponential(fractionDigits)
toExponential()方法以指数表示法返回该数值字符串表示形式。参数fractionDigits可选,其为一个整数用来指定小数点后有几位数字,默认情况下用尽可能多的位数来显示数字。返回一个用幂的形式 (科学记数法) 来表示Number对象的字符串,小数点后以fractionDigits提供的值来四舍五入,如果fractionDigits参数被忽略了,小数点后的将尽可能用最多的位数来表示该数值,对数值字面量使用toExponential()方法,且该数值没有小数点和指数时,应该在该数值与该方法之间隔开一个空格,以避免点号被解释为一个小数点,也可以使用两个点号调用该方法。如果一个数值的小数位数多余fractionDigits参数所提供的,则该数值将会在fractionDigits指定的小数位数处四舍五入。

var num = new Number(100.1);
console.log(num.toExponential()); // 1.001e+2

Number.prototype.toFixed()

numObj.toFixed(digits)
toFixed()方法使用定点表示法来格式化一个数值,该数值在必要时进行四舍五入,另外在必要时会用0来填充小数部分。参数digits是小数点后数字的个数,介于020(包括)之间,实现环境可能支持更大范围,如果忽略该参数,则默认为0

var num = new Number(1.1);
console.log(num.toFixed(6)); // 1.100000

Number.prototype.toLocaleString()

numObj.toLocaleString([locales [, options]])
toLocaleString()方法返回这个数字在特定语言环境下的表示字符串。新的localesoptions参数让应用程序可以指定要进行格式转换的语言,并且定制函数的行为。在旧的实现中,会忽略localesoptions参数,使用的语言环境和返回的字符串的形式完全取决于实现方式。

var num = new Number(1.1);
console.log(num.toLocaleString()); // 1.1

Number.prototype.toPrecision()

numObj.toPrecision(precision)
toPrecision()方法以指定的精度返回该数值对象的字符串表示。参数precision可选,一个用来指定有效数个数的整数。

var num = new Number(1.1);
console.log(num.toPrecision(6)); // 1.100000

Number.prototype.toString()

numObj.toString([radix])
toString()方法返回指定Number对象的字符串表示形式。参数radix指定要用于数字到字符串的转换的基数(从236),如果未指定radix参数,则默认值为10

var num = new Number(10);
console.log(num.toString(2)); // 1010

Number.prototype.valueOf()

numObj.valueOf()
valueOf()方法返回一个被Number对象包装的原始值。

var num = new Number(10);
console.log(num.valueOf()); // 10

每日一题

https://github.com/WindrunnerMax/EveryDay

参考

https://www.boatsky.com/blog/26 https://juejin.cn/post/6880143057930190855 https://segmentfault.com/a/1190000000407658 https://blog.csdn.net/abcdu1/article/details/75095781 https://en.wikipedia.org/wiki/Floating-point_arithmetic https://blog.csdn.net/weixin_43675244/article/details/89518309 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number