LHJ

I'm a FE developer.

8. 흐름제어문(Flow Control Statement) - 반복문

09 Aug 2020 » codespitz_re

반복문

// 아래는 '식'일까 '문'일까?
var a = 3;

// 아래가 에러나는 걸 보면 '선언문'이라는 것을 알 수 있다.
var k = var b = 4;

// ex는 식을 뜻하는 단어이다.
// var b = 4; 이런거 선언문이라면서, 왜 for () 안에 문을 넣을 수 있는 걸까?
// 소괄호 안에는 '식'이 들어간다고 하지 않았나?
// ------for문의 첫번째 인자는 선언문(다른 문은 안된다)이나 식이 들어갈 수 있다.-----
// 나머지 두개 식은 무조건 식만 들어갈 수 있다.
// falsy : '', 0, null, NaN, undefined, false
// falsy 아닌 것들은 다 truthy
// 2번째 인자가 truthy여야 for 문이 실행
// 마지막 3번째 인자는 for 중괄호의 마지막에서 반드시 실행된다.
for (ex; truthy; ex) {

}
// 아래 식도 이해가 간다.
// 마지막 3번째 인자는 식문이 전달되는 것이기 때문에 '공문'도 된다.
for (ex; truthy; ) {

}

// 첫번째 인자도 '문'이 올 수 있다. '공문'처리 가능
// 그런데 truthy여야만 돈다며? 왜 truthy를 비워도 무한 루프를 돌까?
// for의 예외 사항이다.
// for문 가운데에 공문이 오면 truthy로 평가된다는 사항이 공식 문서에 기재되어있다. (언어 스펙)
for (; truthy ;) {

}

// truthy 평가, 무한루프
// 상식적으론 falsy가 되어서 빠져나오는 것이 맞는데 아니다. 예외사항
// 자바스크립트 empty 값은 falsy로 평가되는데 for문만 예외사항으로 평가된다.
// 즉, for문을 쓸 때 가운데를 비우면 항상 truthy로 평가돼서 무한루프에 빠진다.
for (; ;) {

}

// while 문 공백으로 냅두면 죽어버린다. 반드시 truthy 값을 넣어줘야 작동한다.
// while 문 같은 경우는 for문에 비해 훨씬 간단하다. truthy값만 넣어주면 무한루프
while (truthy) {

}

// while 옆 소괄호에 반드시 truthy 값이 와야된다.
do {
  
}while (truthy)

// while 문에 truthy만 넣어주면 무한루프하기 때문에 보통 truthy 넣는 자리에 '런타임 평가항목'을 넣고
// {} 안에서 '런타임 평가항목'의 상태에 변화를 준다.
var a = -1;
while (a < 2) {
    a++;
}

// while 문이 어려운 이유
// 아래와 같이 작성되어있으면 빠져나올 수 있는거야 아니면 무한루프야?
// 이게 현실이다.
// 따라서 우리는 아래와 같은 코드는 무조건 배제한다.
// 또한 아래처럼 짜면 에러날 확률이 백퍼다. 유지보수도 힘들고.
while (act.method().c) {
    other.action();
}

// 이러면 while문이 무한루프인지 아닌지 판단하기 쉬움
// 아래와 같이 명시적으로 런타임 평가 상태에 변화를 주는 식이 while문 바디 안에 들어가있어야 한다.
// while, do while을 쓸 때 무조건 예외 없이 아래와 같이 런타임 평가 상태 변화식(조건식)을 식별할 수 있도록 짜야한다.
var a = act.method().c;
while (a) {
    other.action();
    a = act.method().c;
}

// 위와 같이 짰을 때 장점 하나 더
// 아래처럼 식에 안전장치를 걸어주기 더 쉽다.
// 테스트하기도 쉽고
var a = act.method().c;
while (a) {
    let r = other.action();
    a = act.method().c;
    if (r === 'abc') a = false;
}

while 문은 {} 중문이 권장사항이다.
{} 중괄호가 필수는 아니나 조건식이 있고 다른 식이 있을 텐데, 이를 단문으로 컨트롤 할 수 있겠어? 라는 뜻이다.
do while 문도 {} 중문이 필수가 아니다.
do ‘문’ whild ‘식’

do 'aaa'; while ();

하지만 {} 중문으로 쓰는 것이 권장사항이다.

앞으로 공부해야될 반복문들

  • for … of
  • for … in : forEach 라고 많이 부른다.