JavaScript 数字
-
JavaScript数字
JavaScript只有一种类型的数字。可以使用或不使用小数来编写数字。JavaScript数字始终是64位浮点数 与许多其他编程语言不同,JavaScript没有定义不同类型的数字,如整数,短整数,长整数,浮点数等。JavaScript编号始终存储为双精度浮点数,符合国际IEEE 754标准。此格式以64位存储数字,其中数字(分数)存储在位0到51位,指数存储在位52到62位,符号存储在位63中:
尝试一下var x = 3.14; // 带小数的数字 var y = 3; // 没有小数的数字
可以使用科学(指数)表示法编写超大或超小数字:
尝试一下var x = 123e5; // 12300000 var y = 123e-5; // 0.00123
-
精确位数
整数(没有句号或指数表示法的数字)最多可达15位数。
尝试一下var x = 999999999999999; // x will be 999999999999999 var y = 9999999999999999; // y will be 10000000000000000
小数最大小数位数为17,但浮点运算并不总是100%准确:
尝试一下var x = 0.2 + 0.1; // x will be 0.30000000000000004
用乘法和除法解决上述问题
尝试一下var x = (0.2 * 10 + 0.1 * 10) / 10; // x will be 0.3
-
数字和字符串连接
如果两个数字相加,结果将是一个数字:
尝试一下var x = 10; var y = 20; var z = x + y; // z 是 30 (一个数字)
如果添加两个字符串,结果将是字符串连接:
尝试一下var x = "10"; var y = "20"; var z = x + y; // z 是 1020 (一个字符串)
如果字符串和数字相加,结果将是字符串连接:
尝试一下var x = "10"; var y = 20; var z = x + y; // z 是 1020 (一个字符串)
一个常见的错误是期望这个结果为30:
尝试一下var x = 10; var y = 20; var z = "结果为: " + x + y;
一个常见的错误是期望这个结果是102030:
尝试一下var x = 10; var y = 20; var z = "30"; var result = x + y + z;
JavaScript编译器从左到右工作。 10 + 20,因为x和y都是数字。然后连接30 +“30”,因为z是一个字符串。
-
数字字符串
JavaScript字符串可以包含数字内容:var x = 100; // x 是数字 var y = "100"; // y 是字符串
JavaScript将尝试在所有数字操作中将字符串转换为数字:这将有效:
尝试一下var x = "100"; var y = "10"; var z = x / y; // z 将会为 10
提示:将上例的除法改成其他运算符(- ,* ,%)一样有效。如果是“+”号,那就被编译成字符串拼接。
-
NaN - 不是数字
NaN是一个JavaScript保留字,表示数字不是合法数字。尝试使用非数字字符串进行算术将导致NaN(非数字):
尝试一下var x = 100 / "Apple"; // x 将为 NaN (不是一个数字)
但是,如果字符串包含数字值,则结果将为数字:
尝试一下var x = 100 / "10"; // x 将是 10
您可以使用全局JavaScript函数isNaN()来查明值是否为数字:
尝试一下var x = 100 / "Apple"; isNaN(x); // 返回 true 因为 x 不是一个数字
提防NaN。如果NaN在数学运算中使用,结果也将是NaN:
尝试一下var x = NaN; var y = 5; var z = x + y; // z 是 NaN
或者结果可能是字符串串联:
尝试一下var x = NaN; var y = "5"; var z = x + y; // z 将会是 NaN5
NaN的数据类型是一个数字:typeof NaN返回number:
尝试一下typeof NaN; // 返回 "number"
-
无穷(Infinity)和负无穷(-Infinity)
Infinity(或-Infinity)是如果计算最大可能数字之外的数字,JavaScript将返回的值。
尝试一下var myNumber = 2; while (myNumber != Infinity) { // 执行直到无穷(Infinity) myNumber = myNumber * myNumber; }
除以0(零)也会产生Infinity:
尝试一下var x = 2 / 0; // x 将会是 Infinity var y = -2 / 0; // y 将会是 -Infinity
Infinity的数据类型是一个数字:typeof Infinity返回number。
尝试一下typeof Infinity; // 返回 "number"
-
十六进制
如果数字常量前面带有0x,则它会将数字常量解释为十六进制。
尝试一下var x = 0xFF; // x 是 255(十进制)
永远不要写一个前导零的数字(如07)。如果它们使用前导零写入,一些JavaScript版本将数字解释为八进制。
默认情况下,JavaScript将数字显示为十进制小数。但是您可以使用toString()方法将数字从二进制到三十六进制输出 。
尝试一下var myNumber = 32; myNumber.toString(10); // 返回 32 myNumber.toString(32); // 返回 10 myNumber.toString(16); // 返回 20 myNumber.toString(8); // 返回 40 myNumber.toString(2); // 返回 100000
-
数字可以是对象
通常,JavaScript数字是从文字创建的原始值:var x = 123;但是数字也可以用关键字new定义为对象:var y = new Number(123);
尝试一下var x = 123; var y = new Number(123); // typeof x 返回 number // typeof y 返回 object
不要创建Number对象。除非你清楚自己在干什么。它会降低执行速度。new关键字使代码复杂化。这会产生一些意想不到的结果:
使用==运算符时,相等的数字相等:
尝试一下var x = 500; var y = new Number(500); // (x == y) 为 true 因为 x 和 y 有相等的值
使用===运算符时,相等的数字不相等,因为===运算符期望类型和值都相等。
尝试一下var x = 500; var y = new Number(500); // (x === y) false 因为 x 和 y 数据类型不同
甚至更糟。对象无法比较:
尝试一下var x = new Number(500); var y = new Number(500); // (x == y) false 因为他们各属不同的对象
注意(x==y)和(x===y)之间的差异。比较两个JavaScript对象将始终返回false。