加法 (+)
**加法 (+
)** 运算符生成数值操作数的总和或字符串连接。
试试
语法
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 表格仅在浏览器中加载