inside for..in

요즈음, 이곳저곳 커뮤니티를 돌아다니다 보면
for..in 루프를 마치 악마 처럼 여기고 이와 반대로 for..of 루프를 마치 천사 처럼 여기는 사람들이 보여서
for..in 루프의 내부 알고리즘을 올려보았습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
let x = [1, 2, 3, 4];

// for of way
for(const num of x) { // actually, this just takes x[Symbol.iterator] and use it.
// something awesome
}

// this how for..in really works, seems equal as for..of
for(const num of EnumerateObjectProperties(x)) {
// something awesome
}

// from ECMA-262, they said :
// The following is an informative definition of an ECMAScript generator function that
// conforms to these rules:
function* EnumerateObjectProperties(obj) {
const visited = new Set();
for (const key of Reflect.ownKeys(obj)) {
if (typeof key === "symbol") continue;
const desc = Reflect.getOwnPropertyDescriptor(obj, key);
if (desc && !visited.has(key)) {
visited.add(key);
if (desc.enumerable) yield key;
}
}
const proto = Reflect.getPrototypeOf(obj);
if (proto === null) return;
for (const protoKey of EnumerateObjectProperties(proto)) {
if (!visited.has(protoKey)) yield protoKey;
}
}

Reference: ECMA-262 8th edition

어떠신가요? for..in 루프의 이면이?

많은 분들의 생각과는 달리 for..in 루프와 for..of 루프의 이면에는 악마도, 천사도 존재하지 않습니다.
그저 제너레이터만이 존재할 뿐이지요.

많은 분들이 흘려 들은 이야기로 생성된 기술에 대한 신앙 보다는 확실한 사실에 기반해 생성된 기술에 대한 지식을 가져 주셨으면 하는 바람입니다.

ECMA has copyright of this document

공유하기