You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/05-object-toprimitive/article.md
+28-28Lines changed: 28 additions & 28 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,17 +5,17 @@
5
5
6
6
이 모든 경우에 자동 형 변환이 일어납니다. 객체는 원시값으로 변환되고, 그 후 의도한 연산이 수행됩니다.
7
7
8
-
<info:type-conversions> 챕터에선 객체의 형 변환은 다루지 않았습니다. 원시형 자료가 어떻게 문자, 숫자, 논리형으로 변환되는지만 알아보았죠. 이젠 메서드와 심볼에 대한 지식을 갖추었으니 본격적으로 이 공백을 메꿔보도록 합시다.
8
+
<info:type-conversions> 챕터에선 객체의 형 변환은 다루지 않았습니다. 원시형 자료가 어떻게 문자, 숫자, 논리형으로 변환되는지만 알아보았죠. 이젠 메서드와 심볼에 대한 지식을 갖추었으니 본격적으로 이 공백을 메꿔봅시다.
9
9
10
-
1. 객체는 논리 평가 시 `true`를 반환합니다. 단 하나의 예외도 없기 때문에 객체는 숫자형이나 문자형으로만 형 변환이 일어난다고 생각하시면 됩니다.
11
-
2. 숫자형으로의 형 변환은 객체끼리 빼는 연산을 할 때나 수학 관련 함수를 적용할 때 일어납니다. 객체 `Date`(<info:date>챕터에서 다룰 예정임)끼리 차감하면(`date1 - date2`) 두 날짜의 시간 차이가 반환됩니다.
12
-
3. 문자형으로의 형 변환은 대게`alert(obj)`같이 객체를 출력하려고 할 때 일어납니다.
10
+
1. 객체는 논리 평가 시 `true`를 반환합니다. 단 하나의 예외도 없죠. 따라서 객체는 숫자형이나 문자형으로만 형 변환이 일어난다고 생각하시면 됩니다.
11
+
2. 숫자형으로의 형 변환은 객체끼리 빼는 연산을 할 때나 수학 관련 함수를 적용할 때 일어납니다. 객체 `Date`끼리 차감하면(`date1 - date2`) 두 날짜의 시간 차이가 반환됩니다. `Date`에 대해선 <info:date>에서 다룰 예정입니다.
12
+
3. 문자형으로의 형 변환은 대개`alert(obj)`같이 객체를 출력하려고 할 때 일어납니다.
13
13
14
14
## ToPrimitive
15
15
16
-
특별한 객체 메서드를 사용하면 숫자형이나 문자형으로의 형 변환을 원하는 대로 조절할 수 있습니다.
16
+
특수 객체 메서드를 사용하면 숫자형이나 문자형으로의 형 변환을 원하는 대로 조절할 수 있습니다.
17
17
18
-
객체 형 변환은 세종류로 구분되는데, 'hint'라 불리는 값이 구분 기준이 됩니다. "hint"가 무엇인지는 [명세](https://tc39.github.io/ecma262/#sec-toprimitive)에 자세히 설명되어 있는데, '목표로 하는 자료형' 정도로 이해하시면 될 것 같습니다.
18
+
객체 형 변환은 세종류로 구분되는데, 'hint'라 불리는 값이 구분 기준이 됩니다. 'hint'가 무엇인지는 [명세서](https://tc39.github.io/ecma262/#sec-toprimitive)에 자세히 설명되어 있는데, '목표로 하는 자료형' 정도로 이해하시면 될 것 같습니다.
19
19
20
20
`"string"`
21
21
: `alert` 함수같이 문자열을 기대하는 연산을 수행할 때는(객체-문자형 변환), hint가 `string`이 됩니다.
@@ -44,9 +44,9 @@
44
44
```
45
45
46
46
`"default"`
47
-
: 연산자가 기대하는 자료형이 '확실치 않을 때' hint는 `default`가 되는데 이는 아주 드문 경우입니다.
47
+
: 연산자가 기대하는 자료형이 '확실치 않을 때' hint는 `default`가 됩니다. 아주 드물게 발생합니다.
48
48
49
-
이항 덧셈 연산자 `+`는 피연산자의 자료형에 따라 문자열을 합치는 연산을 할 수도 있고 숫자를 더해주는 연산을 할 수도 있습니다. 따라서 인수가 객체일때 hint는 `default`가 됩니다.
49
+
이항 덧셈 연산자 `+`는 피연산자의 자료형에 따라 문자열을 합치는 연산을 할 수도 있고 숫자를 더해주는 연산을 할 수도 있습니다. 따라서 `+`의 인수가 객체일는 hint가 `default`가 됩니다.
50
50
51
51
동등 연산자 `==`를 사용해 객체-문자형, 객체-숫자형, 객체-심볼형끼리 비교할 때도, 객체를 어떤 자료형으로 바꿔야 할지 확신이 안 서므로 hint는 default가 됩니다.
52
52
@@ -58,7 +58,7 @@
58
58
if (user == 1) { ... };
59
59
```
60
60
61
-
크고 작음을 비교할 때 쓰이는 연산자 `<`, `>` 역시 피연산자에 문자형과 숫자형 둘 다를 허용하는데, 이 연산자들은 hint를 "number"로 고정합니다. hint가 "default"가 되는 일이 없죠. 이는 하위 호환성 때문에 정해진 규칙입니다.
61
+
크고 작음을 비교할 때 쓰이는 연산자 `<`, `>` 역시 피연산자에 문자형과 숫자형 둘 다를 허용하는데, 이 연산자들은 hint를 'number'로 고정합니다. hint가 'default'가 되는 일이 없죠. 이는 하위 호환성 때문에 정해진 규칙입니다.
62
62
63
63
실제 일을 할 때는 이런 사항을 모두 외울 필요는 없습니다. `Date` 객체를 제외한 모든 내장 객체는 hint가 `"default"`인 경우와 `"number"`인 경우를 동일하게 처리하기 때문입니다. 우리도 커스텀 객체를 만들 땐 이런 규칙을 따르면 됩니다.
64
64
@@ -72,9 +72,9 @@ hint는 총 세 가지입니다. 아주 간단하죠.
72
72
73
73
1. 객체에 `obj[Symbol.toPrimitive](hint)`메서드가 있는지 찾고, 있다면 메서드를 호출합니다. `Symbol.toPrimitive`는 시스템 심볼로, 심볼형 키로 사용됩니다.
이런 이유 때문에 `alert`에 객체를 넘기면 `[object Object]`가 출력되는 것입니다.
137
137
138
-
여기서 `valueOf`를 언급하는 것은 튜토리얼의 완성도를 높이고 헷갈리는 것을 줄여주려는데 있습니다. 앞서 본 바와 같이 `valueOf`는 객체 자신을 반환하기 때문에 그 결과가 무시됩니다. 왜 그런거냐고 이유를 묻지는 말아주세요. 그냥 역사적인 이유때문입니다. 우리는 그냥 이 메서드가 존재하지 않는다고 생각하면 됩니다.
138
+
여기서 `valueOf`는 튜토리얼의 완성도를 높이고 헷갈리는 것을 줄여주려고 언급했습니다. 앞서 본 바와 같이 `valueOf`는 객체 자신을 반환하기 때문에 그 결과가 무시됩니다. 왜 그런거냐고 이유를 묻지는 말아주세요. 그냥 역사적인 이유때문입니다. 우리는 그냥 이 메서드가 존재하지 않는다고 생각하면 됩니다.
139
139
140
140
이제 직접 이 메서드들을 사용한 예시를 구현해봅시다.
141
141
142
-
아래 예시의 `user`는 `toString`과 `valueOf`를 조합해 만들었는데, 위 예시에서 `Symbol.toPrimitive`를 사용한 것과 동일하게 동작합니다.
142
+
아래 `user`는 `toString`과 `valueOf`를 조합해 만들었는데, `Symbol.toPrimitive`를 사용한 위쪽 예시와 동일하게 동작합니다.
연산자별로 어떤 hint가 적용되는지는 명세에서 찾아볼 수 있습니다. 연산자가 기대하는 피연산자를 "확신할 수 없을 땐" hint는`"default"`가 됩니다. 이런 경우는 아주 드물지만 말이죠. 내장 객체는 대게 hint가 `"default"`이면, hint가`"number"`일 때와 동일하게 처리합니다. 따라서 실무에선 hint가 `"default"`인 경우와 `"number"`인 경우를 합쳐서 처리할 때가 많습니다.
244
+
연산자별로 어떤 hint가 적용되는지는 명세에서 찾아볼 수 있습니다. 연산자가 기대하는 피연산자를 '확신할 수 없을 때'에는 hint가`"default"`가 됩니다. 이런 경우는 아주 드물게 발생합니다. 내장 객체는 대개 hint가 `"default"`일 때와`"number"`일 때를 동일하게 처리합니다. 따라서 실무에선 hint가 `"default"`인 경우와 `"number"`인 경우를 합쳐서 처리하는 경우가 많습니다.
245
245
246
246
객체-원시형 변환엔 다음 알고리즘이 적용됩니다.
247
247
248
-
1. 객체에 `obj[Symbol.toPrimitive](hint)`메서드가 있는지 찾고, 있다면 메서드를 호출합니다.
248
+
1. 객체에 `obj[Symbol.toPrimitive](hint)`메서드가 있는지 찾고, 있다면 호출합니다.
`obj.toString()`만 사용해도 "모든 변환"을 다 다룰 수 있기 때문에, 실무에선 `obj.toString()`만 구현해도 충분한 경우가 많습니다. 반환 값도 "사람이 읽고 이해할 수 있는" 형식이기 때문에 실용성 측면에서 다른 메서드에 뒤처지지도 않죠. `obj.toString()`은 로깅이나 디버깅 목적으로도 자주 사용됩니다.
254
+
`obj.toString()`만 사용해도 '모든 변환'을 다 다룰 수 있기 때문에, 실무에선 `obj.toString()`만 구현해도 충분한 경우가 많습니다. 반환 값도 '사람이 읽고 이해할 수 있는' 형식이기 때문에 실용성 측면에서 다른 메서드에 뒤처지지 않습니다. `obj.toString()`은 로깅이나 디버깅 목적으로도 자주 사용됩니다.
0 commit comments