このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。
加算演算子 (+)
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
加算 (+) 演算子は、数値オペランドの合計または文字列の連結を生成します。
In this article
試してみましょう
console.log(2 + 2);// 予想される結果: 4console.log(2 + true);// 予想される結果: 3console.log("hello " + "everyone");// 予想される結果: "hello everyone"console.log(2001 + ": A Space Odyssey");// 予想される結果: "2001: A Space Odyssey"構文
x + y解説
演算子+ は数値の加算と文字列の連結という 2 つの異なる操作のためにオーバーロードされています。評価するとき、まず両方のオペランドをプリミティブに変換します。その後、 2 つのオペランドの型がテストされます。
- 一方が文字列の場合、もう一方のオペランドも文字列に変換され、連結されます。
- もし両方が長整数であれば、長整数同士の加算が行われます。一方が長整数で、もう一方が長整数でない場合、
TypeError例外が発生します。 - そうでない場合は、両辺が数値へ変換され、数値同士の加算が行われます。
文字列の連結はテンプレートリテラルやString.prototype.concat() と等価だと思われがちですが、そうではありません。加算はvalueOf() を優先的に呼び出して、式をプリミティブに変換します。一方、テンプレートリテラルとconcat() はtoString()を優先的に呼び出し、式を文字列に変換します。式が[Symbol.toPrimitive]() メソッドを持っている場合、文字列連結は"default" をヒントとしてそれを呼び出しますが、テンプレートリテラルは"string" を使用します。これは、文字列表現とプリミティブ表現が異なるオブジェクト、例えば、Temporal のようにvalueOf() メソッドがすべて例外を発生するようなオブジェクトにとって重要です。
const t = Temporal.Now.instant();"" + t; // TypeError が発生`${t}`; // '2022-07-31T04:48:56.113918308Z'"".concat(t); // '2022-07-31T04:48:56.113918308Z'"" + x を使用して文字列に変換を行わないことをお勧めします。
例
>数値を使用した加算
1 + 2; // 3それ以外の文字列ではなく、長整数ではない値は数値に変換されます。
true + 1; // 2false + false; // 0長整数を使用した加算
1n + 2n; // 3n長整数と数値のオペランドを混在させることはできません。
1n + 2; // TypeError: Cannot mix BigInt and other types, use explicit conversions2 + 1n; // TypeError: Cannot mix BigInt and other types, use explicit conversions"1" + 2n; // TypeError: Cannot mix BigInt and other types, use explicit conversions長整数と長整数以外で加算を行うには、どちらかのオペランドを変換してください。
1n + BigInt(2); // 3nNumber(1n) + 2; // 3文字列を使用した加算
オペランドの一方が文字列の場合、もう一方が文字列に変換され、それらが連結されます。
"foo" + "bar"; // "foobar"5 + "foo"; // "5foo""foo" + false; // "foofalse""2" + 2; // "22"仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-addition-operator-plus> |