더하기 연산자
더하기 연산자 (+)
더하기(+) 연산자는 숫자 피연산자의 합을 생성하거나 문자열 연결(string concatenation)을 수행합니다.
호환성: Baseline — 널리 사용 가능(Widely available). 이 기능은 잘 확립되어 있으며 많은 기기와 브라우저 버전에서 작동합니다. 2015년 7월부터 브라우저에서 사용할 수 있습니다.
출처: Addition (+)
본문
Try it
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"
구문 (Syntax)
x + y
설명 (Description)
+ 연산자는 두 가지 구분되는 연산을 위해 오버로드됩니다: 숫자 더하기와 문자열 연결. 평가할 때 먼저 두 피연산자를 모두 원시 값(primitive)으로 강제 변환합니다. 그런 다음 두 피연산자의 타입이 검사됩니다.
- 한쪽이 문자열이면, 다른 피연산자도 문자열로 변환되어 함께 연결됩니다.
- 둘 다
BigInt이면BigInt더하기가 수행됩니다. 한쪽이BigInt인데 다른 쪽이 아니면TypeError가 발생합니다. - 그 외의 경우, 양쪽 모두 숫자로 변환되어 숫자 더하기가 수행됩니다.
문자열 연결은 종종 템플릿 리터럴이나 String.prototype.concat()과 동등하다고 생각되지만, 그렇지 않습니다. 더하기 연산자는 표현식을 원시 값으로 강제 변환하며, 이때 valueOf()를 우선 호출합니다. 반면 템플릿 리터럴과 concat()은 표현식을 문자열로 강제 변환하며 toString()을 우선 호출합니다. 표현식에 [Symbol.toPrimitive]() 메서드가 있으면, 문자열 연결은 "default" 힌트로 그것을 호출하는 반면 템플릿 리터럴은 "string"을 사용합니다. 이는 서로 다른 문자열 표현과 원시 표현을 가진 객체 — valueOf() 메서드가 모두 던지는 Temporal 같은 — 에 중요합니다.
const t = Temporal.Now.instant();
"" + t; // Throws TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat(t); // '2022-07-31T04:48:56.113918308Z'
문자열 강제 변환을 수행하기 위해 "" + x를 사용하지 않는 것이 좋습니다.
예제 (Examples)
숫자를 사용한 더하기
1 + 2; // 3
문자열이나 BigInt가 아닌 다른 값은 숫자로 강제 변환됩니다.
true + 1; // 2
false + false; // 0
BigInt를 사용한 더하기
1n + 2n; // 3n
더하기에서 BigInt와 숫자 피연산자를 혼합할 수 없습니다. null, undefined, 불리언 값은 숫자로 강제 변환되며 역시 금지됩니다.
1n + 2; // TypeError: Cannot mix BigInt and other types, use explicit conversions
2 + 1n; // TypeError: Cannot mix BigInt and other types, use explicit conversions
문자열은 다른 타입보다 우선합니다. 그래서 BigInt에 문자열을 더하면 TypeError가 아니라 문자열 연결이 생성됩니다.
"1" + 2n; // "12"
BigInt와 비-BigInt로 더하기를 하려면 어느 한쪽 피연산자를 변환하세요.
1n + BigInt(2); // 3n
Number(1n) + 2; // 3
문자열을 사용한 더하기
피연산자 중 하나가 문자열이면, 다른 쪽이 문자열로 변환되어 함께 연결됩니다.
"foo" + "bar"; // "foobar"
5 + "foo"; // "5foo"
"foo" + false; // "foofalse"
"2" + 2; // "22"
명세 (Specifications)
ECMAScript® 2027 언어 명세 — sec-addition-operator-plus