JavaScript 数字
JavaScript 中只规定了一个数字类型,数字可以是整数,也可以是小数。
JavaScript 中只规定了一个数字类型,数字可以是整数,也可以是小数。
let x = 3.14; // 小数
let y = 3; // 整数
数字支持用科学计数法表示:
let x = 123e5; // 12300000
let y = 123e-5; // 0.00123
JavaScript 数字始终是 64 位浮点数
与许多其他编程语言不同,JavaScript 中只有一个表示数字的类型: Number
, 并没有定义不同类型的数字,如整数、短整数、长整数、浮点数等。
遵循国际 IEEE 754 标准,JavaScript 数字始终存储为 64 位双精度浮点数。
数字和字符串拼接
+
运算符在 JavaScript 中是一个特殊的运算符:
- 当两个操作数都是数字的时候,
+
的作用是数字相加。 - 当两个操作数有一个是字符串的时候,
+
的作用是字符串拼接。
如果 +
连接两个数字,结果是数字求和:
let x = 10;
let y = 20;
let z = x + y;
console.log("z =", z); // 输出 z = 30
如果 +
连接两个字符串,结果将是字符串拼接:
let x = "10";
let y = "20";
let z = x + y;
console.log("z =", z); // 输出 z = 1020
如果 +
连接一个数字和一个字符串,结果是字符串拼接:
let x = 10;
let y = "20";
let z = x + y;
console.log("z =", z); // 输出 z = 1020
如果 +
连接一个字符串和一个数字,结果是字符串拼接:
let x = "10";
let y = 20;
let z = x + y;
console.log("z =", z); // 输出 z = 1020
一个组合连接的示例:
let x = 10;
let y = 20;
let z = "30";
let result = x + y + z;
console.log("result =", result); // 输出 result = 3030
注意:上面示例中 JavaScript 首先计算 x + y = 30
, 因为 x 和 y 都是数字。得出的结果 30 再和变量 z 进行字符串拼接, 因为 z 是字符串。
数字字符串
除了上面说的 +
, 对于其他数字运算中的字符串,JavaScript 会尝试将字符串类型转为数字类型再进行计算。
以下示例对两个都是数字的字符串类型的变量进行数学运算。
除法:
let x = "100";
let y = "10";
let z = x / y;
console.log("z =", z); // 输出 z = 10
乘法:
let x = "100";
let y = "10";
let z = x * y;
console.log("z =", z); // 输出 z = 1000
减法:
let x = "100";
let y = "10";
let z = x - y;
console.log("z =", z); // 输出 z = 90
NaN - 非数字
NaN
(Not a Number) 是 JavaScript 保留字,表示数字不是合法数字。
尝试使用非数字字符串进行算术运算将导致 NaN
:
let x = 100 / "Apple";
console.log("x =", x); // 输出 x = NaN
但是,如果字符串是一个数值,则结果将是一个数字:
let x = 100 / "10";
console.log("x =", x); // 输出 x = 10
如果您在数学运算中使用 NaN
,结果也将是 NaN
:
let x = NaN;
let y = 5;
let z = x + y;
console.log("z =", z); // 输出 z = NaN
NaN
是数字类型, typeof NaN
返回 number
:
let typeofNaN = typeof NaN;
console.log("typeof NaN =", typeofNaN); // 输出 typeof NaN = number
您可以使用全局 JavaScript 函数 isNaN()
来判断某个值是否为数字。当 isNaN()
返回 true
的时候,则被判断的值不是数字;。当 isNaN()
返回 false
的时候,则被判断的值是数字。
console.log(isNaN(100)); // 输出 false
console.log(isNaN("100")); // 输出 false
console.log(isNaN("100.01")); // 输出 false
console.log(isNaN("100AB")); // 输出 true
console.log(isNaN("Apple")); // 输出 true
console.log(isNaN(NaN)); // 输出 true
无限 Infinity
全局属性(变量) Infinity
是一个数值,表示正无穷大, -Infinity
表示负无穷大。
除以 0(零)会返回 Infinity
:
let x = 2 / 0;
let y = -2 / 0;
console.log("x =", x); // 输出 x = Infinity
console.log("y =", y); // 输出 y = -Infinity
Infinity
是数字类型, typeof Infinity
返回 number
。
let typeofInfinity = typeof Infinity;
console.log("typeof NaN =", typeofInfinity); // 输出 typeof NaN = number
十六进制
如果数字常量以 0x
开头,则 JavaScript 将其解释为十六进制。
let x = 0xff;
console.log("x =", x); // 输出 x = 255
永远不要写一个带前导零的数字(如 07
)。如果数字以零开头,某些 JavaScript 版本会将数字解释为八进制。
默认情况下,JavaScript 以 10 进制显示数字。但是您可以使用 toString()
方法转为 2 - 36 进制。。
let x = 32;
console.log(x.toString(10)); // 输出 32
console.log(x.toString(32)); // 输出 10
console.log(x.toString(16)); // 输出 20
console.log(x.toString(8)); // 输出 40
console.log(x.toString(2)); // 输出 100000
new Number()
通常 JavaScript 数字是字面量创建:
`let x = 123;`;
也可以通过 new Number()
创建字符串 :
`let y = new Number(123);`;
两种方式创建虽然数值是相同的,但是也有很大的差异。
let x = 100;
let y = new Number(100);
console.log("typeof x =", typeof x); // 输出 typeof x = number
console.log("typeof y =", typeof y); // 输出 typeof y = object
console.log("(x == y) =", x == y); // 输出 (x == y) = true
console.log("(x === y) =", x === y); // 输出 (x === y) = false
从上面的例子看出他们的不同:
- 通过字面量创建的数字的 typeof 为
string
- 通过
new Number()
创建的数字的 typeof 为object
- 通过
==
比较的时候,他们是相等的 - 通过
===
比较的时候,他们是不相等的
使用 new Number()
创建数字会让代码复杂化,降低执行效率,容易引入不易发现的问题。因此除非出于某种目的,一般我们建议不要使用 new Number()
创建数字。