🧷补充: 关于JavaScript数字
JavaScript只有一种类型的数字。可以使用或不使用小数来编写数字。JavaScript数字始终是64位浮点数 与许多其他编程语言不同,JavaScript没有定义不同类型的数字,如整数,短整数,长整数,浮点数等。JavaScript编号始终存储为双精度浮点数,符合国际IEEE 754标准。此格式以64位存储数字,其中数字(分数)存储在位0到51位,指数存储在位52到62位,符号存储在位63中:
值 (aka Fraction/Mantissa) | 指数(Exponent) | 符号(Sign) |
52 bits (0 - 51) | 11 bits (52 - 62) | 1 bit (63) |
JavaScript 数字可以使用也可以不使用小数点来书写:
varpi=3.14; // 使用小数点varx=34; // 不使用小数点
极大或极小的数字可通过科学(指数)计数法来写:
vary=123e5; // 12300000varz=123e-5; // 0.00123
🔩精度
整数(不使用小数点或指数计数法)最多为 15 位。
varx=999999999999999; // x 为 999999999999999 vary=9999999999999999; // y 为 10000000000000000
小数的最大位数是 17,但是浮点运算并不总是 100% 准确:
varx=0.2+0.1; // 输出结果为 0.30000000000000004
用乘法和除法解决上述问题
varx= (0.2*10+0.1*10) /10; // x will be 0.3
🔩数字和字符串连接
如果两个数字相加,结果将是一个数字:
varx=10; vary=20; varz=x+y; // z 是 30 (一个数字)
如果添加两个字符串,结果将是字符串连接:
varx="10"; vary="20"; varz=x+y; // z 是 1020 (一个字符串)
如果字符串和数字相加,结果将是字符串连接:
varx="10"; vary=20; varz=x+y; // z 是 1020 (一个字符串)
一个常见的错误是期望这个结果为30:
varx=10; vary=20; varz="结果为: "+x+y;
一个常见的错误是期望这个结果是102030:
varx=10; vary=20; varz="30"; varresult=x+y+z;
🔩数字字符串
JavaScript字符串可以包含数字内容:
varx=100; // x 是数字vary="100"; // y 是字符串
JavaScript将尝试在所有数字操作中将字符串转换为数字:
这将有效:
varx="100"; vary="10"; varz=x/y; // z 将会为 10
注意:将上例的除法改成其他运算符(- ,* ,%)一样有效。如果是“+”号,那就被编译成字符串拼接。
🔩八进制和十六进制
如果前缀为 0,则 JavaScript 会把数值常量解释为八进制数,如果前缀为 0 和 "x",则解释为十六进制数。
vary=0377; varz=0xFF;
注意:绝不要在数字前面写零,除非您需要进行八进制转换。
默认情况下,JavaScript 数字为十进制显示。
但是你可以使用 toString() 方法 输出16进制、8进制、2进制。
varmyNumber=128; myNumber.toString(16); // 返回 80myNumber.toString(8); // 返回 200myNumber.toString(2); // 返回 10000000
🔩无穷(Infinity)和负无穷(-Infinity)
Infinity(或-Infinity)是如果计算最大可能数字之外的数字,JavaScript将返回的值。
varmyNumber=2; while (myNumber!=Infinity) { // 执行直到无穷(Infinity)myNumber=myNumber*myNumber; }
除以0(零)也会产生Infinity:
varx=2/0; // x 将会是 Infinityvary=-2/0; // y 将会是 -Infinity
Infinity的数据类型是一个数字:typeof Infinity返回number。
typeofInfinity; // 返回 "number"
🔩NaN - 非数字值
NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。可以把 Number 对象设置为该值,来指示其不是数字值。
你可以使用 isNaN() 全局函数来判断一个值是否是 NaN 值。
varx=1000/"Apple"; isNaN(x); // 返回 true,因为x不是数字vary=100/"1000"; isNaN(y); // 返回 false,因为x是一个数字
除以0是无穷大,无穷大是一个数字:
varx=1000/0; isNaN(x); // 返回 false
提防NaN。如果NaN在数学运算中使用,结果也将是NaN:
varx=NaN; vary=5; varz=x+y; // z 是 NaN
或者结果可能是字符串串联:
varx=NaN; vary="5"; varz=x+y; // z 将会是 NaN5
NaN的数据类型是一个数字:typeof NaN返回number:
typeofNaN; // 返回 "number"
注意:NaN == NaN 执行结果是 false,且NaN == ...后面无论是什么都返回false
🔩数字可以是对象
通常,JavaScript数字是从文字创建的原始值:
var x = 123;
但是数字也可以用关键字new定义为对象:
var y = new Number(123);
使用==运算符时,相等的数字相等:
varx=500; vary=newNumber(500); // (x == y) 为 true 因为 x 和 y 有相等的值
使用===运算符时,相等的数字不相等,因为===运算符期望类型和值都相等。
varx=500; vary=newNumber(500); // (x === y) false 因为 x 和 y 数据类型不同
甚至更糟。对象无法比较:
varx=newNumber(500); vary=newNumber(500); // (x == y) false 因为他们各属不同的对象
注意(x==y)和(x===y)之间的差异。比较两个JavaScript对象将始终返回false。
参考来自