对基本数据类型number的详细讲解

前言

本文将详细又简练的带你把基本数据类型之一的number进行讲解,有不对之处欢迎指正

正文

number类型可以是十进制,八进制,十六进制,八进制第一位必须是0,然后是八进制数字序列(0-7),如果字面中的数值超出了范围,前导0会被忽略,后面的数字会被当做十进制解析。十六进制的前两位是以0x开头,后面跟十六进制数字(0-9以及A-F)

1.浮点数值

浮点数值就是我们平时说的小数,在js中,1.10.1.1都是允许的,但是.1不推荐(会解析为0.1),在内存中浮点数所占用的内存是整数的两倍,所以解析器会把1.或者1.0这样的数解析为1整数。浮点数的最高精确位数是17位。

2.数值范围

由于内存的限制,number有最大值和最小值,其中最大值保存在Number.MAX_VALUE中,最小值保存在Number.MIN_VALUE中。

3.NaN(重点)

NaN即非数值,这个数值表示一个本来要返回数值的操作数未返回数值的情况,就比如用一个数字去除以一个字符串就会返回NaN。

①任何涉及NaN的操作都会返回NaN,但是用typeof检测NaN的类型是返回number,因为他本身就是特殊的number类型嘛

②NaN与NaN不相等,其实还是第一条

还有一个isNaN()函数,用来检测接受的参数是否是非数字,isNaN还可以用来检测对象,当检测对象时首先会调用对象的valueOf()方法,确定是否可以转换为数值,如果不能,就基于这个返回值调用toString()方法,在测试返回值。

4.数值转换(重点)

可以使用三个函数把非数值转换为数值,分别是Number()、parseInt()、parseFloat()。

①Number()

Number()可以转换任何数据类型,记住这里指的是任何数据类型,既包括基本数据类型也包括引用类型,对应的转换规则如下:

  1. boolean类型,true转换为1,false转换为0
  2. number类型,输入什么输出什么,NaN类型还是NaN
  3. null类型,转换为0
  4. UNdefined类型,返回NaN
  5. 如果是字符串:
    1. 只包含数字,十进制,如'123',转换为123,八进制的前导零会被忽略转换为十进制,例如'055',转换为55
    2. 如果是有效的小数,转换为相应的小数,前导零还是会被忽略
    3. 如果是十六进制,转换为对应的十进制
    4. 字符串为一个空字符串转换为0
    5. 字符串是其他格式全部转换为NaN,例如'asbdy123','12458adbej'
    6. 如果是对象,类似于isNaN()参数为对象的情况,首先调用对象的valueOf()方法,根据返回值按照前面的规则进行转换,如果结果是NaN则调用对象的toString()方法,注意与isNaN不同的是这次调用的不是valueOf()的返回值了
②parseInt()

这个方法专门用于把字符串转换成数值,无法转换对象

parseInt()会忽略字符串前面的空格,直到找到第一个非空字符

  1. 'abc123'会被转换成NaN
  2. ' 123.14.15abc'会被转换为 123
  3. ' '转换为NaN

另外,parseInt()在处理八进制时存在分歧ES3会正确解析八进制而ES5会忽略前导零,因此这个方法还接受第二个参数,转换时使用的基数(即多少进制)

var num1 = parseInt('af',16); // 175
var num2 = parseInt('af'); // NaN
var num3 = parseInt('010',8); //8
③parseFloat()

这个方法用来解析字符串格式的浮点数

这个方法也是从第一个字符开始解析,而且也会忽略最开始的空格,直至解析到一个非空字符,方法会一直解析到字符串末尾。或者解析到遇见一个无效的浮点数字字符为止,就是说第一个小数点有效,后面的小数点就是无效的。

parseFloat()始终会忽略前导零而且不能传第二个参数即使用什么进制,所以十六进制始终会转换成0,因为是0x开头,所以这个方法只用来解析十进制。

5.基本包装数据类型Number

这里我们补充一下基本包装数据类型Number(是一个对象,已经不是基本数据类型),详细对基本包装数据类型对象的介绍可以查看我的另一篇博文https://www.cnblogs.com/jojo-star/p/13446501.html

Number是与数字值对应的引用类型。要创建Number对象,可以在调用Number构造函数时向其中传递相应的数值。与Boolean类型一样,Number类型也重写了valueOf()、toLocaleString()和toString()方法。重写后的valueOf()方法返回对象表示的基本类型的数值,另外两个方法则返回字符串形式的数值。虽然重写了但是与之前的用法并无什么区别,可以为toString()方法传递一个表示基数的参数,告诉它返回几进制数值的字符串形式,如下面的例子所示。

var num = 10;
console.log(num.toString()); // "10"
console.log(num.toString(2)); // 二进制表示的字符串"1010"
console.log(num.toString(8)); // "12"
console.log(num.toString(10)); // "10"
console.log(num.toString(16)); // "a"

除了继承的方法之外,Number类型还提供了一些用于将数值格式化为字符串的方法。

①toFixed(),会按照指定的小数位返回数值的字符串表示(最大20位),如果数值本身包含的小数位比指定的还多,那么接近指定的最大小数位的值就会舍入(不同浏览器会有不同,对于四舍五入)

var num = 10;
console.log(num.toFixed(2)); // "10.00"
var num1 = 10.005
console.log(num1.toFixed(2)); // '10.01',小于小数位数,就会四舍五入

②toExponential(),该方法返回以指数表示法(也称e表示法)表示的数值的字符串形式。与toFixed()一样,toExponential()也接收一个参数,而且该参数同样也是指定输出结果中的小数位数

 var num = 10;
 console.log(num.toExponential(2)); // "1.00e+1" ,十这个数值很小其实是没有必要使用指数表示的
 var num1 = 1005.12345
 console.log(num1.toExponential(2)); // '1.01e+3'

③toPrecision()方法,如果你想得到表示某个数值的最合适的格式,就应该使用toPrecision()方法。

对于一个数值来说,toPrecision()方法可能会返回固定大小(fixed)格式,也可能返回指数(exponential)格式;具体规则是看哪种格式最合适。这个方法接收一个参数,即表示数值的所有数字的位数(不包括指数部分)

原文地址:https://www.cnblogs.com/jojo-star/p/13407869.html