加法 (+)

**加法 (+)** 运算符生成数值操作数的总和或字符串连接。

试试

语法

js
x + y

描述

+ 运算符对两种不同的操作进行了重载:数值加法和字符串连接。在评估时,它首先 将两个操作数强制转换为基本类型。然后,测试两个操作数的类型

  • 如果一方是字符串,则另一个操作数也将 转换为字符串,并将它们连接起来。
  • 如果它们都是 BigInt,则执行 BigInt 加法。如果一方是 BigInt 但另一方不是,则会抛出 TypeError
  • 否则,两边都会 转换为数字,并执行数值加法。

字符串连接通常被认为等同于 模板字面量String.prototype.concat(),但它们并不相同。加法将表达式强制转换为基本类型,这优先调用 valueOf();另一方面,模板字面量和 concat() 将表达式强制转换为字符串,这优先调用 toString()。如果表达式有 [Symbol.toPrimitive]() 方法,字符串连接会使用 "default" 作为提示调用它,而模板字面量则使用 "string"。这对于具有不同字符串和基本类型表示的对象(例如 Temporal,其 valueOf() 方法会抛出异常)很重要。

js
const t = Temporal.Now.instant();
"" + t; // Throws TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat(t); // '2022-07-31T04:48:56.113918308Z'

建议不要使用 "" + x 执行 字符串强制转换

示例

使用数字进行加法

js
1 + 2; // 3

其他非字符串、非 BigInt 值会强制转换为数字

js
true + 1; // 2
false + false; // 0

使用 BigInt 进行加法

js
1n + 2n; // 3n

您不能在加法中混合 BigInt 和数字操作数。

js
1n + 2; // TypeError: Cannot mix BigInt and other types, use explicit conversions
2 + 1n; // TypeError: Cannot mix BigInt and other types, use explicit conversions
"1" + 2n; // TypeError: Cannot mix BigInt and other types, use explicit conversions

要使用 BigInt 和非 BigInt 进行加法,请转换任一操作数

js
1n + BigInt(2); // 3n
Number(1n) + 2; // 3

使用字符串进行加法

如果其中一个操作数是字符串,则另一个操作数将转换为字符串,并将它们连接起来

js
"foo" + "bar"; // "foobar"
5 + "foo"; // "5foo"
"foo" + false; // "foofalse"
"2" + 2; // "22"

规范

规范
ECMAScript 语言规范
# sec-addition-operator-plus

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参见