加法 (+)
加法运算符 (+) 对数字操作数进行求和,或对字符串进行连接。
试一试
console.log(2 + 2);
// Expected output: 4
console.log(2 + true);
// Expected output: 3
console.log("hello " + "everyone");
// Expected output: "hello everyone"
console.log(2001 + ": A Space Odyssey");
// Expected output: "2001: A Space Odyssey"
语法
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® 2026 语言规范 # sec-addition-operator-plus |
浏览器兼容性
加载中…