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
JavaScript에서는 Array도 객체 Iterate를 할 때 [`for in`](#object.forinloop)을 사용해서 좋을 게 없다. 실제로 Array에 `for in`을 사용하지 말아야 할 근거가 매우 많다.
3
+
JavaScript에서는 배열(Array)도 객체(Object)지만 객체 순회(Iterate)를 할 때 [`for in`](#object.forinloop)을 사용해서 좋을 게 없다. 실제로 배열을 탐색할때 `for in`문 사용하지 말아야 할 이유가 매우 많다.
4
4
5
-
> **Note:** JavaScript의 Array는 *Associative Array*가**아니다**. JavaScript [객체](#object.general)는 key/value만 Mapping할 뿐이다. Associative Array는 순서를 보장하지만, 객체는 보장하지 않는다.
5
+
> **Note:** JavaScript의 배열은 *연관 배열(Associative Array)*이**아니다**. JavaScript는 오직 key/value를 맵핑한 [객체](#object.general)만 있을 뿐이다. 연관 배열은 순서를 보장해주지만 객체는 순서를 보장하지 않는다.
6
6
7
7
`for in`은 프로토타입 체인에 있는 프로퍼티를 모두 훑는(enumerate) 데다가 객체 자신의 프로퍼티만 훑으려면 [`hasOwnProperty`](#object.hasownproperty)를 사용해야 하기 때문에 `for`보다 20배 느리다.
8
8
9
-
### Iteration
9
+
### 배열 순회
10
10
11
-
Array를 Iterate할 때에는 구식인`for`를 사용하는 것이 가장 빠르다.
11
+
배열을 순회 할때는 일반적인`for`문을 사용하는 것이 가장 빠르다.
12
12
13
13
var list = [1, 2, 3, 4, 5, ...... 100000000];
14
14
for(var i = 0, l = list.length; i < l; i++) {
15
15
console.log(list[i]);
16
16
}
17
17
18
-
이 예제에서 `l = list.length`로 Array의 length 값을 캐시해야 한다는 것을 꼭 기억해야 한다.
18
+
이 예제에서 `l = list.length`로 배열의 length 값을 캐시해야 한다는 것을 꼭 기억해야 한다.
19
19
20
-
매 Iterate마다 Array에 있는 `length` 프로퍼티에 접근하는 것은 좀 부담스럽다. 최신 JavaScript 엔진은 이 일을 알아서 처리해주기도 하지만 코드가 늘 새 엔진에서 실행되도록 보장할 방법이 없다.
20
+
매번 반복할때마다 배열에 있는 `length` 프로퍼티에 접근하는 것은 좀 부담스럽다. 최신 JavaScript 엔진은 이 일을 알아서 처리해주기도 하지만 코드가 늘 새 엔진에서 실행되도록 보장할 방법이 없다.
21
21
22
22
실제로 캐시 하지 않으면 성능이 반으로 줄어든다.
23
23
24
24
### `length` 프로퍼티
25
25
26
-
`length` 프로퍼티의 *getter*는 단순히 Array 안에 있는 엘리먼트의 개수를 반환하고 *setter*는 Array를 할당한 수만큼 잘라 버린다.
26
+
`length` 프로퍼티의 *getter*는 단순히 Array 안에 있는 엘리먼트의 개수를 반환하고 *setter*는 배열을 할당한 수만큼 잘라 버린다.
27
27
28
28
var foo = [1, 2, 3, 4, 5, 6];
29
29
foo.length = 3;
@@ -32,8 +32,8 @@ Array를 Iterate할 때에는 구식인 `for`를 사용하는 것이 가장 빠
32
32
foo.length = 6;
33
33
foo; // [1, 2, 3]
34
34
35
-
현재 크기보다 더 작은 값을 할당하면 Array를 자르지만, 현재 크기보다 더 큰 값을 할당한다고 해서 Array를 늘리지 않는다.
35
+
현재 크기보다 더 작은 값을 할당하면 배열을 자르지만, 현재 크기보다 더 큰 값을 할당한다고 해서 배열을 늘리진 않는다.
36
36
37
37
### 결론
38
38
39
-
최적의 성능을 위해서는 `for`를 사용하고 `length` 프로퍼티 값을 캐시해야 한다. Array에`for in`을 사용하면 성능도 떨어지고 버그 나기도 쉽다.
39
+
최적의 성능을 위해서는 `for`문을 사용하고 `length` 프로퍼티 값을 캐시해야 한다. 배열에`for in`을 사용하면 성능도 떨어지고 버그 나기도 쉽다.
Copy file name to clipboardExpand all lines: doc/ko/core/delete.md
+8-8Lines changed: 8 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,10 +1,10 @@
1
-
## `delete`
1
+
## `delete` 연산자
2
2
3
-
간단히 말해서 global 변수, Function, 등은 `DontDelete`속성이기 때문에 delete하지 못 한다.
3
+
간단히 말해서 전역 변수와 전역 함수 그리고 `DontDelete`속성을 가진 자바스크립트 객체는 삭제할 수 없다.
4
4
5
5
### Global 코드와 Function 코드
6
6
7
-
Global이나 Function Scope에 정의한 Fuction이나 변수는 모두 Activation 객체나 Global 객체의 프로퍼티다. 이 프로퍼티는 모두 `DontDelete` 속성을 가진다. Global이나 Function 코드에서 변수나 Function의 정의하면 항상 `DontDelete` 프로퍼티로 만들어진다. 그러니까 delete할 수 없다:
7
+
전역이나 함수 스코프에 정의한 함수나 변수는 모두 Activation 객체나 전역 객체의 프로퍼티다. 이 프로퍼티는 모두 `DontDelete` 속성을 가진다. 전역이나 함수 코드에 정의한 변수와 함수는 항상 `DontDelete` 프로퍼티로 만들어지기 때문에 삭제될 수 없다:
8
8
9
9
// Global 변수:
10
10
var a = 1; // DontDelete가 설정된다.
@@ -21,9 +21,9 @@ Global이나 Function Scope에 정의한 Fuction이나 변수는 모두 Activati
21
21
delete f; // false
22
22
f; // 1
23
23
24
-
### Explicit 프로퍼티
24
+
### 명시적인(Explicit) 프로퍼티
25
25
26
-
다음 예제에서 만드는 프로퍼티는 delete할 수 있다. 이런 걸 Explicit 프로퍼티라고 부른다:
26
+
다음 예제에서 만드는 프로퍼티는 delete할 수 있다. 이런 걸 명시적인(Explicit) 프로퍼티라고 부른다:
27
27
28
28
// Explicit 프로퍼티를 만든다:
29
29
var obj = {x: 1};
@@ -33,7 +33,7 @@ Global이나 Function Scope에 정의한 Fuction이나 변수는 모두 Activati
33
33
obj.x; // undefined
34
34
obj.y; // undefined
35
35
36
-
`obj.x`와 `obj.y`는 `DontDelete` 속성이 아니라서 delete할 수 있다. 그러나 다음과 같은 코드도 잘 동작하기 때문에 헷갈린다:
36
+
`obj.x`와 `obj.y`는 `DontDelete` 속성이 아니라서 delete할 수 있다. 하지만 다음과 같은 코드도 잘 동작하기 때문에 헷갈린다:
37
37
38
38
// IE를 빼고 잘 동작한다:
39
39
var GLOBAL_OBJECT = this;
@@ -42,7 +42,7 @@ Global이나 Function Scope에 정의한 Fuction이나 변수는 모두 Activati
42
42
delete GLOBAL_OBJECT.a; // true
43
43
GLOBAL_OBJECT.a; // undefined
44
44
45
-
[`this`](#function.this)가 Global 객체를 가리키는 것을 이용해서 명시적으로 프로퍼티 `a`를 선언하면 삭제할 수 있다. 이것은 꼼수다.
45
+
[`this`](#function.this)가 전역 객체를 가리키는 것을 이용해서 명시적으로 프로퍼티 `a`를 선언하면 삭제할 수 있다. 이것은 꼼수다.
46
46
47
47
IE (적어도 6-8)는 버그가 있어서 안 된다.
48
48
@@ -73,4 +73,4 @@ Host 객체를 delete하면 어떻게 될지 알 수 없다. 표준에는 어떻
73
73
74
74
### 결론
75
75
76
-
`delete` 연산자는 엉뚱하게 동작할 때가 잦다. 명시적으로 정의한 일반 객체의 프로퍼티만 delete하는 것이 안전하다.
76
+
`delete` 연산자는 엉뚱하게 동작할 때가 많다. 명시적으로 정의한 일반 객체의 프로퍼티만 delete하는 것이 안전하다.
파라미터와 `arguments` 객체의 프로퍼티는 모두 *getter*와 *setter*를 가진다.
48
+
일반 파라미터와 `arguments` 객체의 프로퍼티는 모두 *getter*와 *setter*를 가진다.
49
49
50
50
그래서 파라미터나 `arguments` 객체의 프로퍼티의 값을 바꾸면 둘 다 바뀐다.
51
51
@@ -62,7 +62,7 @@ JavaScript의 모든 Function Scope에는 `arguments`라는 특별한 변수가
62
62
}
63
63
foo(1, 2, 3);
64
64
65
-
### 성능에 대한 진실과 오해.
65
+
### 성능에 대한 오해와 진실.
66
66
67
67
`arguments` 객체는 항상 만들어 지지만 예외도 있다. `arguments`라는 이름의 변수를 Function 안에 정의하거나 그 이름으로 파라미터를 만들면 `arguemnts` 객체는 만들어지지 않는다. 그렇지만, 이럴때는 어차피 안쓰겠다는 의미니까 상관 없다.
68
68
@@ -73,8 +73,8 @@ JavaScript의 모든 Function Scope에는 `arguments`라는 특별한 변수가
73
73
그러나 예외도 있다. 최신 JavaScript 엔진에서 `arguments.callee`를 사용하면 성능이 확 떨어진다.
74
74
75
75
function foo() {
76
-
arguments.callee; // 이 Function를 가리킨다.
77
-
arguments.callee.caller; // 이 Function를 호출한 Function를 가리킨다.
76
+
arguments.callee; // 이 함수를 가리킨다.
77
+
arguments.callee.caller; // 이 함수를 호출한 부모함수를 가리킨다.
78
78
}
79
79
80
80
function bigLoop() {
@@ -83,9 +83,10 @@ JavaScript의 모든 Function Scope에는 `arguments`라는 특별한 변수가
83
83
}
84
84
}
85
85
86
-
이 코드에서 Callee와 Caller를 알아야 하기 때문에 `foo`는 더는 [인라인][1]하지 않는다. 이렇게 쓰면 인라인이 주는 성능상 장점을 포기해야 하는데다가 Function이 호출되는 상황(calling context)에 의존하게 돼 버려서 Encapsulation도 해친다.
86
+
위 코드에서 'foo' 함수는 자기 자신과 자신을 호출한 함수를 알아야 하기 때문에 더이상 [인라인][1]되지 않는다. 이렇게 쓰면 인라인이 주는 성능상 장점을 포기해야 하는데다가 이 함수가 호출되는 상황(calling context)에 의존하게 돼 버려서 캡슐화(Encapsulation)도 해친다.
87
+
(역주: 보통 코드가 컴파일 될때 코드를 인라인 시키면서 최적화 하는데, 위와 같이 arguments.callee나 caller를 사용하게 되면 런타임시에 해당 함수가 결정되므로 인라인 최적화를 할수가 없다.)
87
88
88
-
`arguments.callee`와 그 프로퍼티들은 **절대** 사용하지 말아야 한다.
89
+
`arguments.callee`와 arguments.callee의 프로퍼티들은 **절대** 사용하지 말자!.
89
90
90
91
> **ES5 Note:** strict 모드에서 `arguments.callee`는 deprecated됐기 때문에 사용하면 `TypeError`가 난다.
0 commit comments