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() 创建数字。