【JS学习笔记】Number

348 阅读4分钟

这是我参与更文挑战的第3天,活动详情查看: 更文挑战

Number

Number静态方法

Number.isNaN()

Number的静态方法,先检查参数是否为Number类型,再确定传递的值是否为NaN。它是全局isNaN()稳妥版本

和全局函数isNaN()相比,Number.isNaN() 不会自行将参数转换成数字,只有在参数的值为 NaN 的数字时,才会返回 true

// 全局的isNaN
var isNaN = function(value) {
    var n = Number(value);
    return n !== n;
};
// Number的isNaN
Number.isNaN = Number.isNaN || function(value) {
    return typeof value === "number" && isNaN(value);
    // value不是number类型的就可以不用往后看了。
}
window.isNaN(undefined);        // Number(undefined) -> NaN -> NaN !== NaN -> true
Number.isNaN(undefined);	// typeof undefined -> "undefined" == "number" -> false

关于全局的isNaN()等同于回答了这样一个问题:被测试的值在被强制转换成数值时会不会返回IEEE-754中所谓的“不是数值(not a number)”。

通过Number.isNaN(x)来检测变量x是否是一个NaN将会是一种可靠的做法。

然而,在缺少Number.isNaN函数的情况下, 通过表达式(x !== x) 来检测变量x是否是NaN会更加可靠。

有许多方式来看待isNaN():如果isNaN(x)返回false,那么x在任何算数表达式中都不会使表达式等于NaN;如果返回true,x会使所有算数表达式返回NaN。这就意味着,在JavaScript中,isNaN(x)==true等价于x-0=NaN(在JavaScript中 x-0 == NaN 总是返回false,所以你不用去测试它)。实际上, isNaN(x), isNaN(x - 0),isNaN(Number(x)), Number.isNaN(x - 0),和Number.isNaN(Number(x)) 的返回值都是一样的 并且在JavaScript中isNaN(x)是这些表达式中最短的表达。

举个例子,可以利用这个特殊行为来检测函数的参数是可运算的(可以像number一样进行加减乘除等运算)。如果不可运算,则可赋予这个参数一个默认的值或其他合适的内容。这样,就可以得到一个隐式转换参数值的函数,而这得益于Javascript的全功能性。

参考全局isNaN,有点东西。

Number.isFinite()

确定传递的值类型及本身是否是有限数。

它和window.isFinite()方法不同,这个函数的参数只有数值类型的值,且是有穷的,才返回 true

Number.isInteger()

确定传递的值类型是“number”,且是整数。

parseInt()

parseInt(string, radix)解析一个字符串并返回指定基数的十进制整数radix 是2-36之间的整数,表示被解析字符串的基数。

是Number对象中的一个静态方法,和全局对象上的一样。

Number.parseInt == window.parseInt  // true
parseInt返回值注释
(" 123")123忽略开头的空白字符
("123abc")123
("123.5")123
("abc")NaN第一个字符不是数字就返回NaN
("")NaN
("0xa")10解释为16进制整数
("071")71不会解释为八进制整数
("0xAF", 16)175第二个参数传入要转换的进制
("AF", 16)175省略进制前面的标识也可以
("AF")NaN没有第二参数,按照之前的规则判断
("10", 2)2二进制
("10", 8)8八进制
parseInt(4.7, 10);			// 4
parseInt(9.7 * 1e22, 10); 		// 非常大的数值变成 9
parseInt(0.00000000000234, 10);         // 非常小的数值变成 2

不知所以然。

parseInt()的第一参数会先转换成字符串,再运算。

parseFloat()

要求参数是一个字符串,如果不是字符串,则会先转换成字符串,调用String()转型函数,也就是toString方法。

和全局的parseFloat()方法一样。

parseFloat返回值注释
("1234blue")1234
(" 123.4")123.4
("123.45.6")123.45只看数字后面的第一个小数点
("0xa")0十六进制会返回0,只解析十进制
("0123.4")123.4忽略字符串开头的零
("3.125e7")31250000
("sss123")NaN
(900900719925474099267n)900719925474099300整数太大以至于不能被转换时将失去精度

toString()

除了null、undefined,都有toString方法。

toString()方法返回其字符串形式。

Number重写了toString()方法。对数值调用toString()方法时,传入的参数决定了返回的数值是什么进制的,可以转换2-36进制。

var num = 10;
num.toString(2);                 // 10 -> 1010
num.toString(8);		 // 10 -> 12
num.toString(10);		 // 10 -> 10
num.toString(16);		 // 10 -> a

Number实例方法

toFixed()

取小数点后几位,这方法会四舍五入,有时候有点鬼畜。

返回字符串形式

(2.55).toFixed(1)     // "2.5"
(2.45).toFixed(1)     // "2.5"

有点疑惑,这可能是因为使用了IEEE 754格式表示整数和浮点值。在计算浮点值时会有点不精确。

0.1 + 0.2 !== 0.3     // true
// 0.30000000000000004
2.55 - 2.5  !== 0.05  // true
// 0.04999999999999982

所以2.55在JavaScript中本质上是不满2.55的,只是显示的时候为2.55。所以在四舍五入的时候其实是转换了。

(2.55).toFixed(55)
// "2.5499999999999998223643160599749535322189331054687500000"

toPrecision()

保留几位数,返回字符串形式。

var numObj = 5.123456;
numObj.toPrecision( );  //输出 5.123456
numObj.toPrecision(5); 	//输出 5.1235
numObj.toPrecision(2); 	//输出 5.1
numObj.toPrecision(1); 	//输出 5

// 注意:在某些情况下会以指数表示法返回
console.log((1234.5).toPrecision(2)); // "1.2e+3"