【JS学习笔记】Number

这是我参与更文挑战的第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"
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享