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/01-object/article.md
+4-87Lines changed: 4 additions & 87 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,11 +5,7 @@
5
5
6
6
그런데 객체형은 원시형과 달리 다양한 데이터를 담을 수 있습니다. 키로 구분된 데이터 집합이나 복잡한 개체(entity)를 저장할 수 있죠. 객체는 자바스크립트 거의 모든 면에 녹아있는 개념이므로 자바스크립트를 잘 다루려면 객체를 잘 이해하고 있어야 합니다.
7
7
8
-
<<<<<<< HEAD
9
8
객체는 중괄호 `{…}`를 이용해 만들 수 있습니다. 중괄호 안에는 '키(key): 값(value)' 쌍으로 구성된 *프로퍼티(property)* 를 여러 개 넣을 수 있는데, `키`엔 문자형, `값`엔 모든 자료형이 허용됩니다. 프로퍼티 키는 '프로퍼티 이름' 이라고도 부릅니다.
10
-
=======
11
-
An object can be created with curly braces `{…}` with an optional list of *properties*. A property is a "key: value" pair, where `key` is a string (also called a "property name"), and `value` can be anything.
12
-
>>>>>>> upstream/master
13
9
14
10
서랍장을 상상하면 객체를 이해하기 쉽습니다. 서랍장 안 파일은 프로퍼티, 파일 각각에 붙어있는 이름표는 객체의 키라고 생각하시면 됩니다. 복잡한 서랍장 안에서 이름표를 보고 원하는 파일을 쉽게 찾을 수 있듯이, 객체에선 키를 이용해 프로퍼티를 쉽게 찾을 수 있습니다. 추가나 삭제도 마찬가지입니다.
15
11
@@ -24,11 +20,7 @@ let user = {}; // '객체 리터럴' 문법
24
20
25
21

26
22
27
-
<<<<<<< HEAD
28
23
중괄호 `{...}`를 이용해 객체를 선언하는 것을 *객체 리터럴(object literal)* 이라고 부릅니다. 객체를 선언할 땐 주로 이 방법을 사용합니다.
29
-
=======
30
-
Usually, the curly braces `{...}` are used. That declaration is called an *object literal*.
31
-
>>>>>>> upstream/master
32
24
33
25
## 리터럴과 프로퍼티
34
26
@@ -52,11 +44,7 @@ let user = { // 객체
52
44
53
45

54
46
55
-
<<<<<<< HEAD
56
-
서랍장에 파일을 추가하고 뺄 수 있듯이 개발자는 프로퍼티를 추가, 삭제할 수 있습니다.
57
-
=======
58
-
We can add, remove and read files from it at any time.
59
-
>>>>>>> upstream/master
47
+
서랍장에 파일을 추가하고, 꺼내 읽고, 뺄 수 있듯이 개발자는 프로퍼티를 추가, 조회, 삭제할 수 있습니다.
60
48
61
49
점 표기법(dot notation)을 이용하면 프로퍼티 값을 읽는 것도 가능합니다.
62
50
@@ -74,11 +62,7 @@ user.isAdmin = true;
74
62
75
63

76
64
77
-
<<<<<<< HEAD
78
65
`delete` 연산자를 사용하면 프로퍼티를 삭제할 수 있습니다.
79
-
=======
80
-
To remove a property, we can use the `delete` operator:
81
-
>>>>>>> upstream/master
82
66
83
67
```js
84
68
deleteuser.age;
@@ -108,35 +92,8 @@ let user = {
108
92
```
109
93
이런 쉼표를 'trailing(길게 늘어지는)' 혹은 'hanging(매달리는)' 쉼표라고 부릅니다. 이렇게 끝에 쉼표를 붙이면 모든 프로퍼티가 유사한 형태를 보이기 때문에 프로퍼티를 추가, 삭제, 이동하는 게 쉬워집니다.
110
94
111
-
<<<<<<< HEAD
112
-
````smart header="상수 객체는 수정될 수 있습니다."
113
-
주의하세요. `const`로 선언된 객체는 수정될 수 있습니다.
114
-
115
-
예시:
116
-
117
-
```js run
118
-
const user = {
119
-
name: "John"
120
-
};
121
-
122
-
*!*
123
-
user.name = "Pete"; // (*)
124
-
*/!*
125
-
126
-
alert(user.name); // Pete
127
-
```
128
-
129
-
`(*)`로 표시한 줄에서 오류를 일으키는 것처럼 보일 수 있지만 그렇지 않습니다. `const`는 `user`의 값을 고정하지만, 그 내용은 고정하지 않습니다.
130
-
131
-
`const`는 `user=...`를 전체적으로 설정하려고 할 때만 오류가 발생합니다.
132
-
133
-
상수 객체 프로퍼티를 만드는 또 다른 방법이 있습니다. 이후에 <info:property-descriptors> 챕터에서 다루겠습니다.
134
-
````
135
95
136
96
## 대괄호 표기법
137
-
=======
138
-
## Square brackets
139
-
>>>>>>> upstream/master
140
97
141
98
여러 단어를 조합해 프로퍼티 키를 만든 경우엔, 점 표기법을 사용해 프로퍼티 값을 읽을 수 없습니다.
142
99
@@ -245,21 +202,13 @@ let bag = {
245
202
};
246
203
```
247
204
248
-
<<<<<<< HEAD
249
205
대괄호 표기법은 프로퍼티 이름과 값의 제약을 없애주기 때문에 점 표기법보다 훨씬 강력합니다. 그런데 작성하기 번거롭다는 단점이 있습니다.
250
-
=======
251
-
Square brackets are much more powerful than dot notation. They allow any property names and variables. But they are also more cumbersome to write.
252
-
>>>>>>> upstream/master
253
206
254
207
이런 이유로 프로퍼티 이름이 확정된 상황이고, 단순한 이름이라면 처음엔 점 표기법을 사용하다가 뭔가 복잡한 상황이 발생했을 때 대괄호 표기법으로 바꾸는 경우가 많습니다.
255
208
256
209
## 단축 프로퍼티
257
210
258
-
<<<<<<< HEAD
259
211
실무에선 프로퍼티 값을 기존 변수에서 받아와 사용하는 경우가 종종 있습니다.
260
-
=======
261
-
In real code, we often use existing variables as values for property names.
262
-
>>>>>>> upstream/master
263
212
264
213
예시:
265
214
@@ -304,11 +253,7 @@ let user = {
304
253
305
254
## 프로퍼티 이름의 제약사항
306
255
307
-
<<<<<<< HEAD
308
-
아시다시피 변수 이름(키)엔 'for', 'let', 'return' 같은 예약어를 사용하면 안됩니다.
309
-
=======
310
-
As we already know, a variable cannot have a name equal to one of the language-reserved words like "for", "let", "return" etc.
311
-
>>>>>>> upstream/master
256
+
아시다시피 변수 이름엔 'for', 'let', 'return' 같은 예약어를 사용하면 안됩니다.
312
257
313
258
그런데 객체 프로퍼티엔 이런 제약이 없습니다.
314
259
@@ -381,11 +326,7 @@ alert( "blabla" in user ); // user.blabla는 존재하지 않기 때문에 false
381
326
382
327
`in` 왼쪽엔 반드시 *프로퍼티 이름*이 와야 합니다. 프로퍼티 이름은 보통 따옴표로 감싼 문자열입니다.
383
328
384
-
<<<<<<< HEAD
385
329
따옴표를 생략하면 아래 예시와 같이 엉뚱한 변수가 조사 대상이 됩니다.
386
-
=======
387
-
If we omit quotes, that means a variable should contain the actual name to be tested. For instance:
388
-
>>>>>>> upstream/master
389
330
390
331
```js run
391
332
let user = { age:30 };
@@ -415,11 +356,7 @@ alert( "test" in obj ); // `in`을 사용하면 프로퍼티 유무를 제대로
415
356
`undefined`는 변수는 정의되어 있으나 값이 할당되지 않은 경우에 쓰기 때문에 프로퍼티 값이 `undefined`인 경우는 흔치 않습니다. 값을 '알 수 없거나(unknown)' 값이 '비어 있다는(empty)' 것을 나타낼 때는 주로 `null`을 사용합니다. 위 예시에서 `in` 연산자는 자리에 어울리지 않는 초대손님처럼 보이네요.
416
357
417
358
418
-
<<<<<<< HEAD
419
-
## 'for..in' 반복문
420
-
=======
421
-
## The "for..in" loop [#forin]
422
-
>>>>>>> upstream/master
359
+
## 'for..in' 반복문 [#forin]
423
360
424
361
`for..in` 반복문을 사용하면 객체의 모든 키를 순회할 수 있습니다. `for..in`은 앞서 학습했던 `for(;;)` 반복문과는 완전히 다릅니다.
425
362
@@ -476,11 +413,7 @@ for (let code in codes) {
476
413
*/!*
477
414
```
478
415
479
-
<<<<<<< HEAD
480
416
현재 개발 중인 애플리케이션의 주 사용자가 독일인이라고 가정해 봅시다. 나라 번호를 선택하는 화면에서 `49`가 맨 앞에 오도록 하는 게 좋을 겁니다.
481
-
=======
482
-
The object may be used to suggest a list of options to the user. If we're making a site mainly for a German audience then we probably want `49` to be the first.
483
-
>>>>>>> upstream/master
484
417
485
418
그런데 코드를 실행해 보면 예상과는 전혀 다른 결과가 출력됩니다.
486
419
@@ -492,24 +425,14 @@ The object may be used to suggest a list of options to the user. If we're making
492
425
````smart header="정수 프로퍼티? 그게 뭔가요?"
493
426
'정수 프로퍼티'라는 용어는 변형 없이 정수에서 왔다 갔다 할 수 있는 문자열을 의미합니다.
494
427
495
-
<<<<<<< HEAD
496
428
문자열 "49"는 정수로 변환하거나 변환한 정수를 다시 문자열로 바꿔도 변형이 없기 때문에 정수 프로퍼티입니다. 하지만 '+49'와 '1.2'는 정수 프로퍼티가 아닙니다.
497
429
498
430
```js run
431
+
// Number(...)는 명시적으로 값을 숫자형으로 변환합니다.
499
432
// 함수 Math.trunc는 소수점 아래를 버리고 숫자의 정수부만 반환합니다.
500
433
alert( String(Math.trunc(Number("49"))) ); // '49'가 출력됩니다. 기존에 입력한 값과 같으므로 정수 프로퍼티입니다.
501
434
alert( String(Math.trunc(Number("+49"))) ); // '49'가 출력됩니다. 기존에 입력한 값(+49)과 다르므로 정수 프로퍼티가 아닙니다.
502
435
alert( String(Math.trunc(Number("1.2"))) ); // '1'이 출력됩니다. 기존에 입력한 값(1.2)과 다르므로 정수 프로퍼티가 아닙니다.
503
-
=======
504
-
So, `"49"` is an integer property name, because when it's transformed to an integer number and back, it's still the same. But`"+49"` and `"1.2"` are not:
505
-
506
-
```js run
507
-
// Number(...) explicitly converts to a number
508
-
// Math.trunc is a built-in function that removes the decimal part
0 commit comments