Number 类型
十进制
最基本的数值字面量格式是十进制整数,直接写出来即可:
let intNumber = 55; //整数
八进制
对于八进制
字面量第一个数字必须是零 (0),然后是相应的八进制
数字 (0~7)。
如果字面量中包含的数字超出了应有的范围,就会忽略前缀的零,后面的数字会被当成十进制数
let octalNumber1 = 070; //八进制56
let octalNumber2 = 079; //无效的八进制值,当成79处理
let octalNumber3 = 08; //无效的八进制值,当成8处理
八进制
字面量在严格模式下是无效的,会导致 JavaScript
引擎抛出语法错误,需要通过前缀 0o
来表示。
十六进制
如果要创建十六进制字面 量,必须以 0x
作为数值的前缀,然后是十六进制 (0~9 以及 A ~ F) 十六进制数字中的字母大小写均可。
let hexNumber1 = 0xa; //十六进制10
let hexNumber2 = 0x1f; //十六进制31
浮点数
要定义浮点数,数值中必须包含小数点,而且小数点后面必须至少要有一个数字。
let floatNumber1 = 1.1;
let floatNumber2 = 0.1;
因为浮点值需要额外的空间来存储小数部分、指数部分和符号位,所以导致存储浮点值的使用的内存是存储的整数的两倍。
所以 ECMAScript
总是想法设法把值转成整数计算。如果小数点后面没有数字的情况下,数值就会变成整数
let floatNumber1 = 1. => 1 //小数点后面没有数字,当成整数1处理;
let floatNumber2 = 10.0 ; //小数点后面是零,当成整数0处理;
对于非常大或非常小的数值,浮点值可以用科学记数法来表示。科学记数法用于表示一个应该乘以 10 的给定次幂。
ECMAScript
中科学记数法的格式 要求是一个数值 后面跟一个大写或者小写的 e,再加上一个要乘的 10 的多少次幂。
let floatNumber = 3.125e7; // 31250000
科学记数法也可以用于表示非常小的数值,例如 0.000 000 000 000 000 03
这个数值用科学记数法表示 3e-17
。
浮点值的精确度最高可达 17 位小数,但在算术计算中远不如整数精确。例如 0.1+0.2 得到的不是 0.3,而是0.300 000 000 000 000 04
。
所以永远不要测试某个特定的浮点值。
值的范围
由于的内存限制 ECMAScript
并不支持表示这个世界上的所有数值,
-
ECMAScript
可以表示的最小值保存在Number.MIN_VALUE
中。这个值在多数浏览器中是5e-324
(大约 6-7 位的有效数字)。 -
ECMAScript
可以表示的最大数值保存在Number.MAX_VALUE
。这个值在多数浏览器中是1.7976931348623157e+308
(大约 15 位的有效数字) -
如果一个数大于任何有限值的情况 这个数值会被自动转换为一个特殊的
Infinity
(表示无穷大) -
如果一个数小于任何有限值的情况 这个数值会被自动转换为一个特殊的
-Infinity
(表示负无穷大) -
如果计算返回
Infinity
或者-Infinity
则这个值将不能用于任何计算,要确定一个值是不是有限大(即介于 JavaScript 能表示的最小值和最大值之间), 可以使用isFinite()函数
let result = Number.MAX_VALUE + Number.MAX_VALUE;
console.log(isFinite(result)); //false -
也可以使用
Number.NEGATIVE_INFINITY
和Number.POSITIVE_INFINITY
获取正,负 Infinity
NaN
有一个特殊的值叫 NaN
意思是“不是数值“ (Not a Number),用于表示本来要返回数值的操作失败了(而不是抛出错误)。
-
在
ECMAScript
中 0,+0 或-0 相处会返回NaN
console.log(0 / 0); //NaN
console.log(-0 / +0); //NaN -
如果分子是非零值 分母是 0 则会返回
Infinity
或者-Infinity
console.log(5 / 0); //Infinity
console.log(5 / -0); //-Infinity -
任何涉及到 NaN 的操作始终返回
NaN
如 (NaN/10), -
NaN
不等于 包括NaN
在内的任何值console.log(NaN === NaN); //false
-
ECMAScript
提供了isNaN()
函数,这个函数接受一个参数,可以是任意数据类型,然后判断这个参数是否“不是数值”,把一个值传给isNaN()
后, 该函数会尝试会把它转换为数值,某些非数值的值可以直接转换为数值,如字符串“10”或者布尔值,任何不能转换为数值的都会返回true
console.log(isNaN(NaN)); //true
console.log(isNaN(10)); //false 10是数值
console.log(isNaN("10")); //false 可以转换为数值10
console.log(isNaN("blue")); //true 不可以转换为数值
console.log(isNaN(true)); //false 可以转换为数值1
数值转换
Number()
可以用于任何数据类型
-
布尔值
true
返回 1,false
返回 0console.log(Number(true)); // 1
console.log(Number(false)); // 0 -
数值直接返回
-
null
返回 0console.log(Number(null)); // 0
-
undefined
返回NaN
-
字符串使用于以下规则
-
如果字符串包含数值字符,包括数值字符串前面带加,减的情况,则转换为一个十进制数值
console.log(Number("1")); // 1
console.log(Number("011")); // 11 忽略前面的0 -
如果字符串包含有效的浮点值格式 则会转成对应的浮点值 同样也会忽略前面的零
console.log(Number("1.1")); // 1.1
-
如果字符串包含有效的十六进制格式如”0xf“,或者八进制“0o17” 则会转换成与该十六进制/八进制对应的十进制的整数值
console.log(Number("0xf")); // 15
console.log(Number("0o17")); // 15 -
如果是空字符串(不包含字符),则返回 0;
console.log(Number("")); // 0
-
如果字符串包含除上述情况之外的其他字符串 返回
NaN
-
-
对象, 调用
valueOf()
方法返回的是一个原始值(比如数字)并按照上述规则转换返回的值,如果valueOf()
方法返回的仍然是一个对象 则调用toString()
方法 在按照字符串的规则转换
console.log(
Number({
valueOf: () => {
return 1;
},
}) + 2
); // 3
Number.parseInt()
考虑到用 Number()
函数转换字符串时相对复杂并且有点反常规,通常在需要得到整数的时可以优先使用 parseInt()
函数。
parseInt()
函数更加专注于字符串是否包含数值模式。
-
字符串最前面的空格会被忽略,从第一个非空格字符串开始转换。如果第一个字符串不是
加号
或者减号
parseInt()
会立即返回NaN
console.log(Number.parseInt("011")); // 11
console.log(Number.parseInt("+019")); // 19
console.log(Number.parseInt("")); // NaN Number('')返回0
console.log(Number.parseInt(null)); // NaN Number(null)返回0 -
如果第一个字符时数值字符,
加号
或者减号
则继续依次每个字符,直到字符串末尾,或者碰到非数值字符console.log(Number.parseInt("1234blue")); // 1234
-
parseInt()
函数也能识别不同的整数格式(十进制,八进制,十六进制)。console.log(Number.parseInt("0xf")); // 15
-
不同的数值格式很容易混淆
parseInt()
函数 因此parseInt()
也接收第二个参数用于指定底数(进制数) 如果未提供第二个参数或者将其设置为 0,则根据给定的字符串来自动判断其进制。console.log(Number.parseInt("0xAF", 16)); // 15 按照16进制解析
console.log(Number.parseInt("10", 2)); // 2 按照2进制解析
console.log(Number.parseInt("10", 8)); // 8 按照8进制解析
console.log(Number.parseInt("AF")); // NaN
console.log(Number.parseInt("123", 10)); // 123Number.parseFloat()
parseFloat()
函数的工作方式和parseInt()
函数类似 都是从位置 0 开始检测每个字符, 同样它也是解析到字符串末尾或者解析到无效的浮点字符串为止。parseFloat()
函数只能解析十进制的值 所以不能指定进制console.log(Number.parseFloat("0xA")); // 0
console.log(Number.parseFloat("1234blue")); // 2 1234
console.log(Number.parseFloat("22.5")); // 22.5