[인프런 워밍업 스터디 클럽 2기 FE] 1주차 발자국
1주차 발자국[ 시작 ]javascript, react 스터디가 열린다는 소식에 참여하게 되었다. 회사와 병행할 수 있을까 라는 생각에 쉽지 않을거 같아서 고민하였지만, 한 발자국 더 성장할 수 있는 기회라 생각하여 신청을 하였다. 이번 기회로 javascript의 개념을 더 다잡고, react는 완전 초급 수준이지만 많이 알아갈 수 있었으면 좋겠다.일단 목표는 완주라도 해보자..! 이다. [ 강의 & 과제 ] 강의 정리var, let, const의 차이점과 스코프(=범위), 호이스팅var의 스코프는 함수 레벨에서만 존재하고, let&const의 스코프는 블록 레벨에서 존재호이스팅은 변수의 선언을 변수 범위 맨위로 끌고 오는 현상을 의미하는데, var는 호이스팅이 가능하고 let&const는 호이스팅이 불가능자바스크립트의 타입과 변환원시 타입과 참조 타입 2가지원시 타입 : Boolean, String, Number, null, undefined, Symbol참조 타입 : Object, Array=> 타입 확인 : typeof(변수)계산할 때 필요한 Math Object정말 많이 사용되는 Loop 종류for/in, do/while 사용법for/in은 객체의 속성을 따라 반복Window 객체window의 객체 안에 들어있는 속성 관련 (innerWidth, scrollY, location) 정보DOM (Document Object Model)메모리에 윕 페이지 문서 구조를 트리구조로 표현해서 웹 브라우저가 HTML 페이지를 인식하게 해줌HTML 요소를 선택하기 위한 메소드// 파라미터로 전달한 ID를 가진 태그를 반환 document.getElementById(요소아이디) // 파라미터로 전달한 name 속성을 가진 태그를 반환 document.getElementByName(name속성값) // 파라미터로 전달한 선택자에 맞는 첫 번째 태그를 반환 // class => .hello, id => #hello document.querySelector(선택자) // 파라미터로 전달한 태그이름을 가진 모든 태그들을 반환(배열) document.getElementsByTagName(태그이름) // 파라미터로 전달한 클래스 이름을 가진 모든 태그들을 반환(배열) document.getElementsByClassName(클래스이름) // 파라미터로 전달한 선택지에 맞는 모든 태그들을 반환(배열) document.querySelectorAll(선택자)createElement 메서드로 요소 생성 가능removeChild 메서드는 하나의 노드를 삭제할 때 사용replaceChild 메서드는 원래 있는 child를 삭제하고 새로운 child로 교체할 때 사용addEventListener 메서드는 이벤트가 발생했을 때 이벤트 리스너를 호출하기 위해서는 이벤트 리스너를 해당 객체나 요소에 등록해 주어야 함. Event의 종류Event Bubbling : 가장 깊게 중첩된 요소에 이벤트가 발생했을 때 이벤트가 위로 전달 되는 것Event Capturing : 가장 상단에 있는 요소에서 아래로 이벤트가 내려오는 것이벤트의 3단계 흐름 (캡처링 단계 > 타킷 단계 > 버블링 단계)Event Delegation : 하위 요소의 이벤트를 상위에서 제어 this (bind, call, apply)메서드, 함수, constructor, 화살표 함수에서의 this는 각각 다른 객체를 가리킨다.call, apply, bind를 이용한 함수 호출 방법이 있다.삼항 연산자Event Loop 동기 / 비동기 : 동기(Sync)는 순차적, 비동기(Async)는 비순차적 setTimeout : 만료된 후 함수나 지정한 코드 조작을 실행하는 타이머를 설정setTimeout(() => { console.log('2'); }, 3000);위의 소스가 동작하는 원리 => 자바스크립트 엔진, Web APIs, Event Loop, Callback Queue Closure구조 분해 할당 (Destructuring)let a, b, rest; [a, b] = [10, 20]; console.log(a); // 10 [a, b, ...rest] = [10, 20, 30, 40, 50]; console.log(rest); // [30, 40, 50]전개 연산자 (Spread Operator) Map, Filter, Reduceundefined, nullundefined : 아무 값도 할당받지 않은 상태null : 비어있는 존재하지 않는 값변수에 의도적으로 값이 없다고 할 때는 null을 사용얕은 비교 VS 깊은 비교얕은 비교 : 숫자, 문자열 등 원시 자료형은 값을 비교.깊은 비교 : 객체의 경우에도 값으로 비교. Object depth가 깊지 않은 경우에는 JSON.stringify() 사용하고, 깊은 경우에는 lodash 라이브러리의 isEqual() 사용 얕은 복사 VS 깊은 복사얕은 복사 : spread operator, Object.assign 이외에도 Array.from(), slice도 얕은 복사Object.freeze 메서드로 객체를 동결시켜서 기존 객체가 변경되지 못하게 해줌.깊은 복사 : 주로 lodash, Ramda 등 라이브러리 이용IIFE (Immediately Invoked Function Expression)즉시 실행 함수 표현은 정의되자마자 즉시 실행되는 함수 과제 정리첫번째 과제로 음식 메뉴 앱을 만들었다GitHub URL => food_menu[ 기능 요구사항 ]버튼을 누르면 버튼 type에 해당하는 메뉴들이 화면에 뿌려진다. [ 고민했던 부분 ]버튼을 누를 때마다 유동적으로 HTML의 부분이 변경되어야 하는 부분을 고민했었던거 같다.요소를 생성하고 삭제하고 부모의 요소 아래에 append하여 DOM을 만들었고, 없어져야 하는 부분은 removeChild를 이용해서 없애주고 새로 생성하는 방식으로 진행하였다.처음 web을 열었을 때 모든 메뉴들이 나오게 하기 위해 첫 실행 시 페이지 로드하는 함수를 넣어주었다.[ 회고 ]DOM을 조작해 본 적이 많지 않아서 이 부분이 익숙하지 않았다. 이번 과제를 계기로 DOM에 대해서 많이 찾아보고 알아갔던 시간이었고, 기본기에 부족함을 느껴 DOM의 개념에 대해 좀 더 공부해야할 거 같다.Data 부분을 배열로 가져왔는데 json 형식으로 변경해서 값을 가져오는 방식으로 변경해야겠다.두번째 과제로 가위 바위 보 게임을 만들었다.GitHub URL => 가위바위보앱[ 기능 요구사항 ]가위, 바위, 보 각각의 버튼을 누르면 플레이어의 선택으로 저장되고, 컴퓨터는 Random 함수를 이용해 결정플레이어와 컴퓨터의 값을 보고 비교하여 승, 패, 무승부 결정버튼을 한번씩 누를때마다 횟수를 한개씩 차감[ 고민했던 부분 ]게임이 끝나면 가위바위보의 버튼 부분이 사라지고, 게임 결과와 함께 다시 시작 버튼이 나오는 부분을 어떻게 하면 효율적으로 할 수 있을까 고민했다. 게임 결과 부분만 게임이 끝나면 나오게 요소를 생성해주고 다시 시작을 누르면 요소를 삭제하는 방식으로 진행하였다.[ 회고 ]현재는 결과만 표시되게 되는데, 플레이어와 컴퓨터의 결과가 나오기 전에 결과 표시하는 부분에 애니메이션을 넣어 이미지가 랜덤 돌아가게 표현하고 싶다. [ 1주차 회고 ]1주차에는 javascript 관련 강의와 과제를 진행하였다. 아직 못 들은 강의가 있고, 과제도 몇 개는 하지 못했다. 시간 날 때마다 강의를 듣고 과제도 하였는데 생각보다 시간도 많이 필요했고 계획에 맞게 못한 거 같아서 너무 아쉽다. 그래도 이번주에 들은 강의와 과제한 것으로 알게 된 점도 많이 있었다. 밀린 강의와 과제가 있지만 열심히 해서 끝까지 완주하고 싶다.