티스토리 뷰
목차
JavaScript "10" + 1 = "101" , "10" - 1 = 9 인 이유. 사양을 잘 살펴봐야 합니다.
결과를 오해하기 전에 사양을 잘 살펴보자
JavaScript 더하기 연산자 (+)
12.8.3 The Addition Operator (+)를 살펴보도록 합시다.
▶ NOTE The addition operator either performs string concatenation or numeric addition.
12.8.3.1 Runtime Semantics : Evaluation
AdditiveExpression : AdditiveExpression + MultiplicativeExpression
더하기 연산자는 문자의 연결과 숫자의 덧셈을 한다는 것을 알 수 있습니다.
다음으로 JavaScript에서 처리의 흐름을 살펴 보도록 해요.
- Let lref be the result of evaluating AdditiveExpression.
- Let lval be? GetValue (lref).
- Let rref be the result of evaluating MultiplicativeExpression.
- Let rval be? GetValue (rref).
- Let lprim be? ToPrimitive (lval).
- Let rprim be? ToPrimitive (rval).
- If Type (lprim) is String or Type (rprim) is String, then
- a. Let lstr be? ToString (lprim)
- b. Let rstr be? ToString (rprim).
- c. Return the string-concatenation of lstr and rstr.
- Let lnum be? ToNumeric (lprim).
- Let rnum be? ToNumeric (rprim).
- If Type (lnum) is different from Type (rnum) throw a TypeError exception.
- Let T be Type (lnum).
- Return T :: add (lnum, rnum)
흐름을 확인하면 7에서 형식 검사를 한다는 걸 알 수 있습니다.
확인할 값이 String인 경우 ToString() 호출하는 사양을 볼 수 있네요.
그렇지 않은 경우엔 ToNumeric()입니다.
확인 후 깨달은 점
JavaScript 더하기 연산자(+)는 문자의 연결, 숫자를 더하는 기능을 담당합니다.
값의 형식을 검사하여 문자열이나 숫자로 변환하고 있습니다.
JavaScript 빼기 연산자 (-)
12.8.4 The Subtraction Operator (-) 를 살펴 보도록 합시다.
▶ 12.8.4.1 Runtime Semantics : Evaluation
AdditiveExpression : AdditiveExpression-MultiplicativeExpression
- Let lref be the result of evaluating AdditiveExpression.
- Let lval be? GetValue (lref).
- Let rref be the result of evaluating MultiplicativeExpression.
- Let rval be? GetValue (rref).
- Let lnum be? ToNumeric (lval).
- Let rnum be? ToNumeric (rval).
- If Type (lnum) is different from Type (rnum) throw a TypeError exception.
- Let T be Type (lnum).
- Return T : subtract (lnum, rnum).
보시면 이해가 됩니다. 타입 검사가 없네요.
뺄셈 연산자엔 문자열 연결 기능은 없어서 자료형(데이터 타입)을 변환할 필요가 없다는 뜻입니다.
값을 숫자로 변환하여 그대로 처리한다는 것을 알 수 있습니다.
확인 후 깨달은 점
JavaScript 빼기 연산자 (-)는 숫자의 뺄셈을 담당하는 기능입니다.
평가 값을(형식 검사없이) 숫자로 변환합니다.
정리
더하기 연산자(+)는 형식 검사 결과, 문자의 연결로 처리하기 때문에 "10"+ 1은 "101" 입니다.
빼기 연산자 (-)는 숫자의 뺄셈만 하기 때문에 "10"- 1은 9 가 됩니다.
이제 왜 "10" + 1 은 "101" 이고 "10" - 1 은 9 가 되는지 확신을 갖고 말할 수 있게 되었습니다!
앞으로는 이런 JavaScript 코드에 대한 질문도 정확하게 대답할 수 있겠네요!