본문 바로가기
Frontend/JavaScript

JavaScript의 for문(for-in | for-of | forEach)에 대해 알아보자

by 코딩쥐 2024. 7. 23.

객체와 배열

우선 for문에 대해 들어가기 전에 객체배열의 차이점에 대해서 이야기하고자 한다

배열 항목 객체
let arr = [요소1, 요소2,..] 선언방법 let obj = {키1:속성1, 키2:속성2,...}
값(요소,item), length  포함 값  키(key), 값(value)  ==> 속성(property)
순서가 있다. 인덱스로 설정되어 있다. 순서여부 순서가 없다.
배열명[인덱스]
*인덱스는 차례대로 0부터 길이-1까지의 숫자
접근방법 객체명.키, 객체명['키']
*키를 통해서 값을 불러온다.

 

배열과 객체를 알아보는 방법으로는 Array.isArray();를 사용할 수 도 있고, console.dir을 사용해서 프로포타입이 array인지 object인지를 확인하여 알아볼 수 있다.

더보기
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        let arr = [1,2,3,4,5];
        let obj = {0:1,1:2,2:3,3:4,4:5};
        
        console.log(Array.isArray(arr)); //true
        console.log(Array.isArray(obj)); //false
        console.dir(arr); //Array
        console.dir(obj); //Object
    </script>
</body>

</html>

 

For문 

for문에는 일반for문, for-in문, for-of문 그리고 forEach문이 있다.  

종류 적용 대상 사용 가능한 객체  
for-in 객체 enumerable객체
(열거가능한, 객체 속성 중 하나)
key에 접근
for-of iterator 객체가 있는 타입
*array, String, Set 등
iterable 객체
(반복가능한, iterator객체가 있는 타입)
값에 접근
forEach 배열 iterable객체
(forEach()메서드를 포함하고 있는 타입)
값, 인덱스, 원본배열을 인수로 사용

 

 

for-in

객체처럼 key와 value가 있는 경우 사용하는 반복문이다. 객체에 있는 key값을 사용하여 value를 불러올 수 있다. for-in의 경우 array에도 사용할 수는 있지만 일반적으로 object를 제외한 객체에는 사용하지 않는 것이 좋다.

  • for (const 변수 in 객체명){
    로직
    };
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        let obj = {
        val1:1,
        val2:2,
        val3:3
        }; 

        for (const key in obj) {
            console.log(`${key} 값 : ${obj[key]}`);
        }
    </script>
</body>

</html>

 

for-of

iterator 객체가 있는 타입에서 사용이 가능하다. break, continue, return문과 함께 사용할 수 있다. 객체들 중에서 String, Array, Map, Set 등은 모두 프로토타입 객체가 symbol.iterator메서드가 있기 때문에 반복가능한 객체이다. 

  • for (const 변수 of iterator객체명){
    로직
    };
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        let str = "abcdefg";
        let arr = [2,9,3]; //forEach(), Symbol.iterator 둘 다 있음

        for (const i of str) {
            console.log(`str의 값 : ${i}`);
        }

        for (const i of arr) {
            console.log(`arr의 값 : ${i}`);            
        }
    </script>
</body>

</html>


forEach()

배열의 각 요소를 순회하며 주어진 함수를 호출한다. 각 요소에 대해 함수를 호출할 때 요소의 값, 인덱스 그리고 원본 배열을 인수로 넘겨준다. 주어진 함수의 경우 배열의 크기만큼 반복된다. 콜백함수는 어떤 함수에 인자로 전달되어, 함수 내부에서 시행되는 함수에 전달되는 인자를 의미한다.

  • 배열명.forEach((element, index, array) => {
    로직
    }); 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        let arr = [2,9,3,8,5,6]; //forEach(), Symbol.iterator 둘 다 있음

        // forEach
        arr.forEach((element, index, array) => {
            console.log(`arr의 element: ${element}`);
            console.log(`arr의 index에 따른 값: ${arr[index]}`);
            console.log(array);
        });
    </script>
</body>
</html>

여기서는 요소, 인덱스, 배열을 내부 함수에 인자로 전달했다. 그리고 이 배열의 길이가 6이여서 6번 반복되는 것을 볼 수 있다. 콜백함수로는 function()을 전달할 수도 있다. forEach문을 사용해서, 배열에 반복되는 함수를 적용할 수 있다. 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        let arr = [2,9,3,8,5,6]; //forEach(), Symbol.iterator 둘 다 있음
        let sum = 0;

        arr.forEach(function(number){
            sum += number;
            console.log(`숫자들의 합은 ${sum} 입니다.`);
        });
       
    </script>
</body>

</html>

function과 forEach를 사용해서 숫자들의 값이 차례대로 더해질 수 있도록 했다. 첫번째 인덱스에 있는 숫자부터 하나씩 더해지는 것을 볼 수 있다.