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)을 사용해서 좋을 게 없다.
3
+
JavaScript에서는 Array도 객체 Iterate를 할 때 [`for in`](#object.forinloop)을 사용해서 좋을 게 없다. 실제로 Array에 `for in`을 사용하지 말아야 할 근거가 매우 많다.
4
4
5
-
> **Note:** JavaScript의 Array는 *Associative Array*가 **아니다**. JavaScript [객체](#object.general)는 key/value만 mapping 할 뿐이다. Associative Array는 순서를 보장하지만, 객체는 보장하지 않는다.
5
+
> **Note:** JavaScript의 Array는 *Associative Array*가 **아니다**. JavaScript [객체](#object.general)는 key/value만 Mapping할 뿐이다. Associative Array는 순서를 보장하지만, 객체는 보장하지 않는다.
6
6
7
7
`for in`은 프로토타입 체인에 있는 프로퍼티를 모두 훑는(enumerate) 데다가 객체 자신의 프로퍼티만 훑으려면 [`hasOwnProperty`](#object.hasownproperty)를 사용해야 하기 때문에 `for`보다 20배 느리다.
8
8
9
9
### Iteration
10
10
11
-
Array를 Iterate 할 때에는 구식인 `for`를 사용하는 것이 가장 빠르다.
11
+
Array를 Iterate할 때에는 구식인 `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`로 Array의 length 값을 캐시해야 한다는 것을 꼭 기억해야 한다.
19
19
20
-
Array에 있는 `length`프로퍼티를 iterate마다 사용하는 것은 좀 부담스럽다. 최신 JavaScript 엔진은 이 일을 알아서 처리하기도 하지만 코드가 새 엔진에서 실행되도록 보장할 방법이 없다.
20
+
매 Iterate마다 Array에 있는 `length`프로퍼티에 접근하는 것은 좀 부담스럽다. 최신 JavaScript 엔진은 이 일을 알아서 처리해주기도 하지만 코드가 늘 새 엔진에서 실행되도록 보장할 방법이 없다.
21
21
22
22
실제로 캐시 하지 않으면 성능이 반으로 줄어든다.
23
23
24
24
### `length` 프로퍼티
25
25
26
-
`length` 프로퍼티의 *getter*는 단순히 Array 안에 있는 엘리먼트의 개수를 반환하고 *setter*는 할당한 수로 Array를 잘라 버린다.
26
+
`length` 프로퍼티의 *getter*는 단순히 Array 안에 있는 엘리먼트의 개수를 반환하고 *setter*는 Array를 할당한 수만큼 잘라 버린다.
27
27
28
28
var foo = [1, 2, 3, 4, 5, 6];
29
29
foo.length = 3;
@@ -32,8 +32,8 @@ Array에 있는 `length` 프로퍼티를 iterate마다 사용하는 것은 좀
32
32
foo.length = 6;
33
33
foo; // [1, 2, 3]
34
34
35
-
현재 크기보다 더 작은 값을 할당하면 Array를 자르지만, 현재 크기보다 더 큰 값을 할당하면 아무것도 하지 않는다.
35
+
현재 크기보다 더 작은 값을 할당하면 Array를 자르지만, 현재 크기보다 더 큰 값을 할당한다고 해서 Array를 늘리지 않는다.
36
36
37
37
### 결론
38
38
39
-
최적의 성능을 위해서`for`를 사용하고 `length` 프로퍼티 값을 캐시 하길 바란다. Array에 `for in`을 사용하면 성능도 떨어지고 버그 나기도 쉽다.
39
+
최적의 성능을 위해서는`for`를 사용하고 `length` 프로퍼티 값을 캐시해야 한다. Array에 `for in`을 사용하면 성능도 떨어지고 버그 나기도 쉽다.
Copy file name to clipboardExpand all lines: doc/ko/core/delete.md
+13-13Lines changed: 13 additions & 13 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,17 +1,17 @@
1
1
## `delete`
2
2
3
-
간단히 말해서 global 변수, 함수, 등은 `DontDelete` 속성이기 때문에 삭제 못 한다.
3
+
간단히 말해서 global 변수, Function, 등은 `DontDelete` 속성이기 때문에 delete하지 못 한다.
4
4
5
-
### Global 코드와 함수 코드
5
+
### Global 코드와 Function 코드
6
6
7
-
Global이나 Function scope에 정의된 함수나 변수는 모두 Activation 객체나 Global 객체의 프로퍼티다. 이 프로퍼티는 모두 `DontDelete`속성을 가진다. Global이나 Function 코드에서 변수나 함수의 정의하면 항상 `DontDelete` 프로퍼티로 만들어진다. 그러니까 삭제할 수 없다:
7
+
Global이나 Function Scope에 정의한 Fuction이나 변수는 모두 Activation 객체나 Global 객체의 프로퍼티다. 이 프로퍼티는 모두 `DontDelete`속성을 가진다. Global이나 Function 코드에서 변수나 Function의 정의하면 항상 `DontDelete` 프로퍼티로 만들어진다. 그러니까 delete할 수 없다:
8
8
9
9
// Global 변수:
10
10
var a = 1; // DontDelete가 설정된다.
11
11
delete a; // false
12
12
a; // 1
13
13
14
-
// 함수:
14
+
// Function:
15
15
function f() {} // DontDelete가 설정된다.
16
16
delete f; // false
17
17
typeof f; // "function"
@@ -23,7 +23,7 @@ Global이나 Function scope에 정의된 함수나 변수는 모두 Activation
23
23
24
24
### Explicit 프로퍼티
25
25
26
-
다음 예제에서 만드는 property는 정상적으로 지워진다. 이런 걸 Explicit 프로퍼티라고 부른다:
26
+
다음 예제에서 만드는 프로퍼티는 delete할 수 있다. 이런 걸 Explicit 프로퍼티라고 부른다:
27
27
28
28
// Explicit 프로퍼티를 만든다:
29
29
var obj = {x: 1};
@@ -33,24 +33,24 @@ Global이나 Function scope에 정의된 함수나 변수는 모두 Activation
33
33
obj.x; // undefined
34
34
obj.y; // undefined
35
35
36
-
`obj.x`와 `obj.y`는 `DontDelete` 속성이 아녀서 삭제된다. 그러나 다음과 같은 코드도 잘 동작하기 때문에 헷갈린다.:
36
+
`obj.x`와 `obj.y`는 `DontDelete` 속성이 아니라서 delete할 수 있다. 그러나 다음과 같은 코드도 잘 동작하기 때문에 헷갈린다:
37
37
38
-
// IE를 빼고 잘 동작한다.:
38
+
// IE를 빼고 잘 동작한다:
39
39
var GLOBAL_OBJECT = this;
40
40
GLOBAL_OBJECT.a = 1;
41
-
a === GLOBAL_OBJECT.a; // true - 진짜 Global 변순지 확인하는 것
41
+
a === GLOBAL_OBJECT.a; // true - 진짜 Global 변수인지 확인하는 것
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)가 Global 객체를 가리키는 것을 이용해서 명시적으로 프로퍼티 `a`를 선언하면 삭제할 수 있다. 이것은 꼼수다.
@@ -66,7 +66,7 @@ JavaScript에서 세미콜론을 자동으로 삽입한 것은 **대표적인**
66
66
{ // 파서는 단순 블럭이라고 생각하고
67
67
68
68
// 단순한 레이블과 함수
69
-
foo: function() {}
69
+
foo: function() {}
70
70
}; // <- 여기
71
71
}
72
72
window.test = test; // <- 여기
@@ -75,15 +75,15 @@ JavaScript에서 세미콜론을 자동으로 삽입한 것은 **대표적인**
75
75
})(window)(function(window) {
76
76
window.someLibrary = {}; // <- 여기
77
77
78
-
})(window); //<- 여기에 파서는 세미콜론을 넣는다.
78
+
})(window); //<- 여기에 파서는 쎄미콜론을 넣는다.
79
79
80
-
> **주의:** JavaScript 파서는 new line 문자가 뒤따라 오는 return 구문을 제대로 처리하지 못한다. 자동으로 세미콜론을 넣는 것 자체의 문제는 아니지만 어쨌든 여전히 문제로 남아있다.
80
+
> **주의:** JavaScript 파서는 new line 문자가 뒤따라 오는 return 구문을 제대로 처리하지 못한다. 자동으로 쎄미콜론을 넣는 것 자체의 문제는 아니지만 어쨌든 여전히 문제다.
81
81
82
82
파서는 완전히 다른 코드로 만들어 버린다. 이것은 **오류**다.
83
83
84
84
### Parenthesis
85
85
86
-
세미콜론 없이 괄호가 붙어 있으면 파서는 세미콜론을 넣지 않는다.
86
+
쎄미콜론 없이 괄호가 붙어 있으면 파서는 쎄미콜론을 넣지 않는다.
87
87
88
88
log('testing!')
89
89
(options.list || []).forEach(function(i) {})
@@ -96,4 +96,4 @@ JavaScript에서 세미콜론을 자동으로 삽입한 것은 **대표적인**
96
96
97
97
### 결론
98
98
99
-
세미콜론은 반드시 사용해야 한다. 그리고 `{}`도 생략하지 않고 꼭 사용하는 것이 좋다. 한 줄밖에 안 되는 `if` / `else` 블럭에서도 꼭 사용해야 한다. 이 두 가지 규칙을 잘 지키면 JavaScript 파서가 잘못 해석하는 일을 미리 방지하고 코드도 튼튼해진다.
99
+
쎄미콜론은 반드시 사용해야 한다. 그리고 `{}`도 생략하지 않고 꼭 사용하는 것이 좋다. 한 줄밖에 안 되는 `if` / `else` 블럭에서도 꼭 사용해야 한다. 이 두 가지 규칙을 잘 지키면 JavaScript 파서가 잘못 해석하는 일을 미리 방지하고 코드도 튼튼해진다.
0 commit comments