for...in ๊ณผ for...of์ ์ฐจ์ด์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
for...in
- for...in ๋ฌธ์ ์์๋ ์ด๊ฑฐ ๊ฐ๋ฅํ ์์ฑ๋ค์ ํฌํจํ์ฌ ๊ฐ์ฒด์์ ๋ฌธ์์ด๋ก ํค๊ฐ ์ง์ ๋ ๋ชจ๋ ์ด๊ฑฐ ๊ฐ๋ฅํ ์์ฑ์ ๋ํด ๋ฐ๋ณตํฉ๋๋ค.
for (variable in object) {
statement;
}
์ด๊ฑฐ ๊ฐ๋ฅํ ์์ฑ(enumerable)
- ๊ฐ์ฒด๋ฅผ ์ ์ธํ์ฌ ์ดํด๋ณด๋ฉด [[Prototype]] ์ด๋ผ๋ ๊ฒ์ด ์์ต๋๋ค.
- ์ด๊ฑฐ ๊ฐ๋ฅํ ์์ฑ์ด ๋ฌด์์ธ์ง ์ดํดํ๊ธฐ ์ํด Prototype์ ๋ํด ๋จผ์ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
Prototype
- JS๋ ํ๋กํ ํ์ ๊ธฐ๋ฐ ๊ฐ์ฒด์งํฅ์ธ์ด์ด๋ฉฐ, ํ๋กํ ํ์ ์ฒด์ธ์ ํตํด ์์ฑ์ ์์ํฉ๋๋ค.
- JS์ ๋ชจ๋ ๊ฐ์ฒด๋ ๋ถ๋ชจ ์ญํ ์ ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋์ด ์์ด, ๋ถ๋ชจ ๊ฐ์ฒด์ ํ๋กํผํฐ ๋๋ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ด๋ฌํ ๋ถ๋ชจ ๊ฐ์ฒด๋ฅผ ํ๋กํ ํ์ (Prototype)์ด๋ผ ํฉ๋๋ค.
- ์ง์ ์์ฑํ ์์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๊ฑฐ ๊ฐ๋ฅํ๋ฉฐ, ํ๋กํ ํ์
์ฒด์ธ์ ํตํด ์์๋ฐ์ ์์ฑ์ ์์ฑ ๋ช
์ธ์
enumerable
๊ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
enumerable
Object.getOwnPropertyDescriptor()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ enumerable ๊ฐ์ ํ์ธํ ์ ์์ต๋๋ค.enumerable: false
๋ผ๋ฉด ์ด๊ฑฐ ๊ฐ๋ฅํ์ง ์์ ์์ฑ์ด๋ฉฐ,enumerable: true
๋ผ๋ฉด ์ด๊ฑฐ ๊ฐ๋ฅํ ์์ฑ์ ๋๋ค.- ์๋์ ๊ฐ์ด toString ๋ฉ์๋๋ ์ด๊ฑฐ ๊ฐ๋ฅํ์ง ์์ ์์ฑ์ด๊ธฐ์ for...in ๋ฃจํ๋ก ๊ฐ์ฒด ์์ฑ์ ๋ฐ๋ณตํ๋๋ผ๋ toString์ ๋์ค์ง ์๋ ๊ฒ์ ๋๋ค.
const desc = Object.getOwnPropertyDescriptor(Object.prototype, "toString");
console.log(desc);
/*
{ value: [Function: toString],
writable: true,
enumerable: false,
configurable: true }
*/
- ํ๋กํ ํ์ ์ผ๋ก๋ถํฐ ์ด๊ฑฐ ๊ฐ๋ฅํ์ง ์์ ์์ฑ์ ์์๋ฐ์์ผ๋ ํ๋กํ ํ์ ์ฒด์ธ ์์ ์๋ ์์ฑ๊ณผ ๊ฐ์ฒด ์์ฒด์ ์๋ ์์ฑ์ด ์ถฉ๋ํ๋ค๋ฉด, ๊ฐ์ฒด ์์ฒด์ ํ๋กํผํฐ๋ฅผ ์ฐ์ ํฉ๋๋ค.
- ์๋์ ๊ฐ์ด ๊ฐ์ฒด ์์์ toString์ ์๋กญ๊ฒ ์์ฑํ์ ๊ฒฝ์ฐ, ์ด๋ ํ๋กํ ํ์ ์ฒด์ธ ์์ toString๊ณผ ์ถฉ๋ํ๊ธฐ์ ์ปค์คํ ํ toString์ด ์ฐ์ ์ ๋์ด for...in ๋ฃจํ์์ ๋ฐ๋ณตํ ์ ์๋ ๊ฒ์ ๋๋ค.
const obj = {
a: 1,
b: 2,
toString: function () {
console.log("Custom toString");
},
};
for (const key in obj) {
console.log(obj[key]);
/*
1
2
ƒ () {
console.log('Custom toString');
}
*/
}
for...of
- for...of ๋ฌธ์ ๋ฐ๋ณต๊ฐ๋ฅํ ๊ฐ์ฒด(Array, Map, Set, String, TypedArray, Arguments ๊ฐ์ฒด ๋ฑ)์ ๋ํด์ ๋ฐ๋ณตํฉ๋๋ค.
- [Symbol.iterator] ์์ฑ์ด ์๋ ๋ชจ๋ ์ปฌ๋ ์ ์์์ ๋ํด ๋ฐ๋ณตํฉ๋๋ค.
for (variable of iterable) {
statement;
}
[Symbol.iterator] ์์ฑ
- ๋ฐฐ์ด์ ์ ์ธํ์ฌ ์ดํด๋ณด๋ฉด Symbol.iterator ์์ฑ์ด ์์ต๋๋ค.
- [Symbol.iterator] ์์ฑ์ ์ดํดํ๋ ค๋ฉด ์ดํฐ๋ ์ด์ ํ๋กํ ์ฝ์ ๋จผ์ ์ดํดํด์ผ ํฉ๋๋ค.
์ดํฐ๋ ์ด์ ํ๋กํ ์ฝ(iteration protocol)
- ES6์์ ๋์ ๋ ์ดํฐ๋ ์ด์ ํ๋กํ ์ฝ(iteration protocol)์ ๋ฐ์ดํฐ ์ปฌ๋ ์ ์ ์ํํ๊ธฐ ์ํ ํ๋กํ ์ฝ(๋ฏธ๋ฆฌ ์ฝ์๋ ๊ท์น)์ ๋๋ค.
- ์ดํฐ๋ ์ด์
ํ๋กํ ์ฝ์ ์ค์ํ ๊ฐ์ฒด๋
for…of
๋ฌธ์ผ๋ก ์ํํ ์ ์๊ณ Spread ๋ฌธ๋ฒ(...)์ ํผ์ฐ์ฐ์๊ฐ ๋ ์ ์์ต๋๋ค. - ์ดํฐ๋ ์ด์
ํ๋กํ ์ฝ์๋ ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ(iterable protocol)๊ณผ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ(iterator protocol)์ด ์์ต๋๋ค.
- ์ด์ค์์ ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ์ค์ํ ๊ฐ์ฒด๋ฅผ ์ดํฐ๋ฌ๋ธ(iterable)์ด๋ผ ํฉ๋๋ค.
- ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๊ฐ์ฒด๋ ๋ฐ๋์ Symbol.iterator ๋ฉ์๋๋ฅผ ๊ตฌํํ๊ฑฐ๋ ํ๋กํ ํ์ ์ฒด์ธ์ ์ํด ์์ํด์ผ ํฉ๋๋ค.
๊ทธ๋ผ ๋ค์ [Symbol.iterator] ์ด์ผ๊ธฐ๋ก ๋์๊ฐ๋ณด๊ฒ ์ต๋๋ค.
- ES6์์ ์ ๊ณตํ๋ ๋นํธ์ธ ์ดํฐ๋ฌ๋ธ์๋ Array, String, Map, Set, TypedArray(Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array), DOM data structure(NodeList, HTMLCollection), Arguments๊ฐ ์์ต๋๋ค.
- ์ด๋ฌํ ์์๋ค์ ์์ฑ์ ์ดํด๋ณด๋ฉด Symbol.iterator๊ฐ ์์ต๋๋ค. ์ฆ, for...of๋ก ์ํํ ์ ์๋ค๋ ๋ป์ ๋๋ค.
๊ฒฐ๋ก
- ๊ฐ์ฒด์ ์์ฑ์ ๋ฐ๋ณตํ ๋๋
for...in
์ ์ฌ์ฉํฉ๋๋ค. - ๋ฐฐ์ด, ๋ฌธ์์ด, Map, Set ๋ฑ์ ๋ฐ๋ณตํ ๋๋
for...of
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฐธ๊ณ
- MDN
- ๋ธ๋ก๊ทธ
- PoiemaWeb
- ํ๋ก๊ทธ๋๋จธ์ค Q&A
'Language > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] parseInt( ) vs Number( ) (1) | 2024.08.27 |
---|---|
[JavaScript] JavaScript์ ์ผ๊ธ๊ฐ์ฒด๋? (0) | 2024.07.05 |