这是我参与更文挑战的第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"
复制代码