├── .gitignore
├── ADVANCE
├── SECTION01
│ └── readme.md
├── SECTION02
│ ├── function.js
│ └── readme.md
├── SECTION03
│ ├── log.js
│ └── readme.md
├── SECTION04
│ ├── binding.js
│ ├── readme.md
│ └── scope.js
├── SECTION05
│ ├── readme.md
│ ├── test.js
│ └── this.js
├── SECTION06
│ ├── closer.js
│ └── readme.md
├── image
│ └── executingContext.png
└── readme.md
├── BASIC
├── CallStack.html
├── Error.html
├── SECTION01
│ ├── readme.md
│ └── typeof.js
├── SECTION02
│ └── readme.md
├── SECTION03
│ ├── homework.js
│ ├── homework2.js
│ └── readme.md
├── SECTION04
│ └── readme.md
├── SECTION05
│ └── readme.md
├── SECTION06
│ └── readme.md
├── SECTION07
│ └── readme.md
├── SECTION08
│ ├── readme.md
│ └── string.js
├── SECTION09
│ └── readme.md
├── SECTION10
│ └── readme.md
├── SECTION11
│ ├── endecode.js
│ └── readme.md
├── SECTION12
│ ├── readme.md
│ └── test.js
├── SECTION13
│ └── readme.md
├── SECTION14
│ └── readme.md
├── SECTION15
│ ├── parse.js
│ └── readme.md
├── chapter2.js
├── chapter3.js
├── ex.js
├── public
│ ├── Async_Sync.png
│ ├── async.png
│ ├── async2.png
│ ├── http.png
│ ├── polymorphism.png
│ ├── promise.png
│ ├── url.png
│ └── www.png
└── readme.md
├── DEEPDIVE
├── .gitignore
├── MDN.js
├── ajax.html
├── callback.html
├── callbackhell.html
├── captureBubble.html
├── closure.js
├── debounce.html
├── error.js
├── event.html
├── event2.html
├── eventDelegation.html
├── evntloop.html
├── ex.html
├── ex.js
├── ex2.html
├── ex3.html
├── fetch.html
├── fetchResponse.html
├── gitFetch.html
├── images
│ ├── 1.jpg
│ ├── 11_1.jpg
│ ├── 11_2.jpg
│ ├── 11_3.jpg
│ ├── 11_4.jpg
│ ├── 11_7.jpg
│ ├── 11_8.jpg
│ ├── 11_9.jpg
│ ├── 12_1.jpg
│ ├── 12_2.jpg
│ ├── 12_5.jpg
│ ├── 12_6.jpg
│ ├── 12_7.jpg
│ ├── 12_8.jpg
│ ├── 13_1.jpg
│ ├── 13_2.jpg
│ ├── 13_3.jpg
│ ├── 15_3.jpg
│ ├── 19_1.jpg
│ ├── 19_10.png
│ ├── 19_11.png
│ ├── 19_2.jpg
│ ├── 19_9.png
│ ├── 25_1.jpg
│ ├── 25_2.jpg
│ ├── 26.jpg
│ ├── 26_2.jpg
│ ├── 27.jpg
│ ├── 27_2.jpg
│ ├── 28.jpg
│ ├── 29_1.jpg
│ ├── 29_2.jpg
│ ├── 30_1.JPG
│ ├── 30_10.JPG
│ ├── 30_11.JPG
│ ├── 30_12.JPG
│ ├── 30_13.JPG
│ ├── 30_2.JPG
│ ├── 30_3.JPG
│ ├── 30_4.JPG
│ ├── 30_5.JPG
│ ├── 30_6.JPG
│ ├── 30_7.JPG
│ ├── 30_8.JPG
│ ├── 30_9.JPG
│ ├── 31_1.JPG
│ ├── 31_2.JPG
│ ├── 31_3.JPG
│ ├── 31_4.JPG
│ ├── 31_5.JPG
│ ├── 32_1.png
│ ├── 32_2.png
│ ├── 33_1.jpg
│ ├── 33_2.jpg
│ ├── 33_3.jpg
│ ├── 33_4.jpg
│ ├── 34_1.png
│ ├── 35_1.jpg
│ ├── 35_10.JPG
│ ├── 35_11.JPG
│ ├── 35_2.jpg
│ ├── 35_3.jpg
│ ├── 35_4.jpeg
│ ├── 35_5.JPG
│ ├── 35_7.JPG
│ ├── 35_8.JPG
│ ├── 35_9.JPG
│ ├── 36_1.jpg
│ ├── 36_10.png
│ ├── 36_11.png
│ ├── 36_2.jpg
│ ├── 36_3.JPG
│ ├── 36_4.JPG
│ ├── 36_5.png
│ ├── 36_6.png
│ ├── 36_7.jpg
│ ├── 36_8.png
│ ├── 36_9.png
│ ├── 37_1.png
│ ├── 37_2.png
│ ├── 37_3.png
│ ├── 37_4.png
│ ├── 37_5.png
│ ├── 37_6.jpg
│ ├── 38_1.png
│ ├── 38_2.png
│ ├── 39_1.jpg
│ ├── 39_2.jpg
│ ├── 39_3.jpg
│ ├── 39_4.jpg
│ ├── 39_5.jpg
│ ├── 40_1.jpg
│ ├── 40_2.jpg
│ ├── 40_3.jpg
│ ├── 40_4.png
│ ├── 41_1.jpg
│ ├── 41_2.png
│ ├── 41_3.png
│ ├── 41_4.png
│ ├── 41_5.png
│ ├── 41_6.gif
│ ├── 42_1.png
│ ├── 4_9.jpg
│ ├── 5_2.jpg
│ ├── async.gif
│ ├── closure1.png
│ ├── closure2.png
│ ├── closure3.png
│ ├── coca.png
│ ├── debounce.gif
│ ├── debounce2.gif
│ ├── delete.gif
│ ├── dir.png
│ ├── get.gif
│ ├── get_one.gif
│ ├── gocha1.jpg
│ ├── gocha2.jpg
│ ├── loopResult.gif
│ ├── memory.jpg
│ ├── memory2.jpg
│ ├── memory3.jpg
│ ├── nonSleep.gif
│ ├── patch.gif
│ ├── pepsi.png
│ ├── post.gif
│ ├── proto21.jpg
│ ├── proto22.jpg
│ ├── proto23.jpg
│ ├── proto24.jpg
│ ├── put.gif
│ ├── sleep.gif
│ ├── throttle.gif
│ ├── throttle2.gif
│ ├── timer.gif
│ └── window_console.png
├── loop.js
├── mouse.html
├── nodeFetch.html
├── promise.html
├── readme.md
├── readme2.md
├── readme3.md
├── readme4.md
├── readme5.md
├── readme6.md
├── readme7.md
├── readme8.md
├── scope.html
├── serial.js
├── taskQueue.html
├── throttle.html
├── time.js
├── timer.html
└── timer.js
├── ES6
├── SECTION01
│ └── readme.md
├── SECTION02
│ ├── arrow.js
│ └── readme.md
├── SECTION03
│ └── readme.md
├── SECTION04
│ └── readme.md
└── readme.md
├── async
├── callback.js
├── closure.js
├── promise.js
└── readme.md
├── esnext-project
├── .gitignore
├── babel.config.json
├── dist
│ └── js
│ │ ├── bundle.js
│ │ ├── bundle.js.map
│ │ ├── lib.js
│ │ └── main.js
├── index.html
├── package-lock.json
├── package.json
├── src
│ └── js
│ │ ├── lib.js
│ │ └── main.js
├── webpack.config.js
└── yarn.lock
├── index.html
├── json-server-exam
├── .gitignore
├── db.json
├── package.json
├── public
│ ├── delete.html
│ ├── get_All.html
│ ├── get_one.html
│ ├── patch.html
│ ├── post.html
│ └── put.html
└── yarn.lock
└── readme.md
/.gitignore:
--------------------------------------------------------------------------------
1 | /knowledge
--------------------------------------------------------------------------------
/ADVANCE/SECTION01/readme.md:
--------------------------------------------------------------------------------
1 | ## 엔진 관점의 핵심 키워드
2 |
3 | Execution context (묶어서 실행)
4 |
5 | Identifier Resolution (식별자 해결)
6 |
7 | ## Execution Context 형태
8 |
9 | Context는 묶음, 하나의 덩어리라고 본다.
10 |
11 |
12 |
13 | book() 함수가 호출되면
14 |
15 | - function show()와 만나면서 show Function 오브젝트를 생성한다
16 | - show의 [[scope]]에 스코프 설정
17 | - [[scope]]는 JS엔진에 의해 만들어지는 스코프(범위)를 의미한다.
18 |
19 |
20 |
21 | show() 함수가 호출되면 EC(Execute Context) 환경을 구축한다.
22 |
23 | - LEC, VEC, TBC 생성 첨부
24 | - LEC에 ER, OLER 첨부
25 | - ER에 DER, OER 첨부
26 |
27 |
28 |
29 | DER에 show()의 변수, 함수를 기록한다
30 | OLER에 show의 [[scope]]를 설정
31 | this 바인딩 컴포넌트에 this 참조 설정
32 |
33 | ```js
34 | function book() {
35 | // 2. Function 오브젝트에 의해 book(){....} 내부의 코드들은 모두 같은 스코프에 존재하게 됨 (show() 함수가 속해있는 영역)
36 | // 3. 따라서 point를 getPoint() 함수에서 참조하여 사용할 수 있게 됨
37 | var point = 123;
38 | function show() {
39 | // 1. function 키워드를 만나면서 Function 오브젝트를 생성
40 | var title = "JS책";
41 | // getPoint(); 4. 주석처리 되어 있지만, 같은 스코프에 있기 때문에 getPoint() 함수를 show() 함수 내부에서 사용할 수 있다.
42 | // this.bookAmount;
43 | }
44 | function getPoint() {
45 | return point;
46 | }
47 | show();
48 | }
49 | book();
50 |
51 | /*
52 | 1. 처음 JS 엔진은 해당 코드(boook())가 호출되기 전까지는 function book(){...} 함수가 선언되었다는 것만 인지하고 값을 넣지 않는다.
53 | 2. book() 함수가 호출되었을 때 비로소 function book(){...} 안의 코드를 읽기 시작한다.
54 | 3. point 변수를 선언한다.
55 | 4. function 키워드를 만나므로 show()라는 이름은 가진 Function 오브젝트를 생성한다.
56 | 5. Function 오브젝트를 생성했기 때문에, 해당 함수가 있는 { ... } 코드를 스코프로 설정한다.
57 | 6. 따라서 같은 스코프 안에 있는 함수와 변수는 불러와 사용할 수 있게 되었다.
58 | */
59 | ```
60 |
61 |
62 |
63 | ## 식별자 해결, 스코프 용도
64 |
65 | ### 식별자 해결
66 |
67 | Identifier Resolution
68 |
69 | ```js
70 | var point = 100;
71 | function getPoint(){
72 | var point = 200;
73 | return point;
74 | };
75 | var result = getPoint();
76 | console.log(result);
77 |
78 | >>>
79 | 200
80 |
81 | /*
82 | var point = 100; 이 있음에도 result 값이 200을 반환하는 이유는
83 | 1. getPoint() 함수를 호출함에 따라 생긴 Function 오브젝트에 속해있는 스코프를 먼저 찾기 때문이다.
84 | 2. var point = 200; 이 같은 스코프 내인 getPoint(){ ... } 내부에 설정되지 않았다면 100을 뽑았을 것이다.
85 | */
86 | ```
87 |
88 | - 사용할 변수/함수를 결정하는 것
89 | - 예 : point 변수
90 | - 신속, 정확한 검색을 위해 스코프 필요
91 |
92 |
93 | 스코프에서 이름을 찾기 위해
94 | - 스코프에 이름을 설정
95 | - 값은 변경되지만, 이름은 변경되지 않음 [key : value] 중 value만 변경 가능
96 | - 식별자 해결 대상은 이름
97 |
98 | ### 스코프 용도
99 |
100 | 식별자 해결을 위한 수단, 방법
101 |
102 | - 스코프가 목적이 아니다
103 | > getPoint()가 호출되어 해당 함수를 통해 구하고자 하는 값인, point를 반환하기 위해 스코프를 설정한 것임
104 |
105 | 식별자가 유일하면
106 |
107 | - 스코프는 필요하지 않음
108 | - 하지만, 유일하게 작성하는 것은 불가능
109 | - 그래서 스코프 필요
110 |
111 | ## scope chain, 스펙의 scope chain 사용 (x)
112 |
113 | ## Lexical Environment
114 |
115 | ### 정적 환경
116 |
117 | ```js
118 | var point = 123;
119 | function book() {
120 | function getPoint() {
121 | return point;
122 | };
123 | }
124 | book();
125 | >>>
126 | 123
127 | ```
128 |
129 | function 키워드를 만나면
130 |
131 | - Function 오브젝트를 생성하고
132 | - 스코프를 FO(Function Object)의 [[Scope]]에 설정
133 | - 이것은 함수 밖의 스코프가 설정되는 것
134 |
135 | 이 시점에서 스코프가 결정됨
136 |
137 | - 이것이 Lexical Environment
138 | - 동적이 아닌 수동적(정적)으로 결정된다는 의미
139 |
140 | ## Node.js 코드 형태
141 |
142 | 서버 프로그램 고려 사항
143 |
144 | - 동시 접속자가 1만명 이상인가?
145 |
146 | JS는 Single thread
147 |
148 | - 싱글 스레드란 하나의 함수가 호출되어 끝날 때까지 다른 함수가 호출되지 않음을 의미
149 | - 따라서 순차적(동기적) 처리를 한다.
150 |
151 | Node.js에서 JS는 비동기 처리
152 |
153 | Contetxt 형태가 효율성이 높음
154 |
155 | - ES5의 실행 콘텍스트는 Context 형태
156 |
157 | 실행 콘텍스트에
158 |
159 | - 최적화된 형태로 코드를 작성해야 하며
160 | - 이를 위해 엔진 처리를 이해할 필요가 있다.
161 |
162 |
163 | 다음으로 가기
164 |
--------------------------------------------------------------------------------
/ADVANCE/SECTION02/function.js:
--------------------------------------------------------------------------------
1 | // function book() {
2 | // debugger;
3 | // console.log(title);
4 | // console.log(readBook);
5 | // console.log(getBook);
6 |
7 | // var title = 'JS BOOK';
8 | // function getBook() {
9 | // return title;
10 | // }
11 | // var readBook = function () {};
12 | // getBook();
13 | // }
14 |
15 | // book();
16 |
17 | function book() {
18 | debugger;
19 |
20 | var title = 'JS BOOK';
21 | const getBook = function () {
22 | return title;
23 | };
24 | const readBook = function () {};
25 | getBook();
26 |
27 | console.log(title);
28 | console.log(readBook);
29 | console.log(getBook);
30 | }
31 |
32 | book();
33 |
--------------------------------------------------------------------------------
/ADVANCE/SECTION02/readme.md:
--------------------------------------------------------------------------------
1 | ## Function 오브젝트
2 |
3 | ### 생각의 전환
4 |
5 | 함수가 호출되면 엔진은
6 |
7 | - 함수의 변수와 함수를 {name : value} 형태로 실행 환경을 설정하고 함수 코드를 실행합니다.
8 |
9 | {name: value} 형태로 생각을 전환해야
10 |
11 | - JS의 아키텍처와 메커니즘을 쉽게 이해할 수 있습니다.
12 |
13 | function(){} 코드를 보면
14 |
15 | - 함수의 변수와 함수가 {name: value} 형태로 연상되어야 합니다.
16 | - 프로퍼티 관점으로 보아라
17 |
18 | ```js
19 | function book() {
20 | var title = 'JS BOOk';
21 | return title;
22 | }
23 |
24 | var result = book();
25 | console.log(result);
26 |
27 | >>>
28 | JS BOOK
29 | /*
30 | {title : 'JS BOOK'}
31 | {return : title}
32 | */
33 | ```
34 |
35 |
36 |
37 | ## function 오브젝트 생성 과정
38 |
39 | ```js
40 | sports = {
41 | prototype: {
42 | constructor: sports
43 | __proto__: {
44 | }
45 | }
46 | }
47 | ```
48 |
49 | 1. function sports(){...} 형태에서 function 키워드를 만나면
50 | 2. Function 오브젝트를 생성하고
51 | > {sports: {...}}
52 | > sports는 function 오브젝트 이름
53 | > 오브젝트{...}에 프로퍼티가 없는 상태
54 | > sports() 함수가 호출되어야 안의 코드를 실행하고 오브젝트를 채웁니다
55 | 3. sports 오브젝트에 prototype 오브젝트 첨부
56 | 4. prototype에 constructor(생상자) 프로퍼티 첨부
57 | > prototype.constructor가 sports 오브젝트 참조
58 | 5. prototype에 `__proto__` 오브젝트 첨부
59 |
60 | ```js
61 | sports = {
62 | arguments: {},
63 | caller: {},
64 | length: 0,
65 | name: "sports",
66 | prototype: {
67 | constructor: sports,
68 | __proto__: Object.prototype,
69 | //6. prototype.`__proto__`에 첨부, , Object 오브젝트의 프로토타입에 빌트인 된 6개의 메소드들은 여기에 들어있음
70 | },
71 | __proto__: Function.prototype,
72 | /*
73 | 7. sports 오브젝트에 __proto__ 빌트인 Function 오브젝트의 프로토타입에 연결된 3개의 메소드 (bind, apply, call)는 여기에 들어 있음
74 |
75 | */
76 | };
77 | ```
78 |
79 | 6. 빌트인 Object.prototype의 메소드로
80 | - Object 인스턴스를 생성하여
81 | - prototype.`__proto__`에 첨부
82 | 7. sports 오브젝트에 `__proto__` 오브젝트 첨부
83 | - sports.`__proto__` 구조가 됩니다.
84 | 8. sports 오브젝트가 function 이기 때문에, Function의 프로토타입이 가지는 빌트인 메소드를 생성했지만
85 | - Array라면 Array의 인스턴스가 연결되고
86 | - String이라면 String 인스턴스가 연결됩니다.
87 | > 오브젝트의 타입에 따라 연결되는 인스턴스가 달라집니다.
88 |
89 |
90 |
91 | ## JS 엔진 해석 방법
92 |
93 | ### 엔진 해석 순서
94 |
95 | 자바스크립트는 스크립팅 언어입니다
96 |
97 | - 스크립팅 언어는 작성된 코드를 위에서부터 한 줄씩 해석하고 실행
98 | - 하지만, 자바스크립트는 조금 차이가 있다.
99 |
100 | 중간에 있는 코드가 먼저 해석될 수도 있음
101 | 첫 번째, 함수 선언문을 작성한 순서대로 해석
102 |
103 | > function sports(){...};
104 |
105 | 두 번째, 표현식을 순서대로 해석
106 |
107 | > var sports = function(){...};
108 |
109 | ```js
110 | case 1:
111 | function book() {
112 | debugger;
113 | log(title);
114 | log(readBook);
115 | log(getBook);
116 |
117 | var title = 'JS BOOK';
118 | function getBook() {
119 | return title;
120 | }
121 | var readBook = function () {};
122 | getBook();
123 | }
124 |
125 | book();
126 |
127 | >>>
128 | undefined
129 | undefined
130 | function getBook(){return title};
131 |
132 | /*
133 | book() 함수를 호출 했을 때,
134 |
135 | 1. 함수 선언문 해석 (1바퀴)
136 | - function getBook(){};
137 | 2. 변수 초기화 (2바퀴)
138 | - var title = undefined;
139 | - var readBook = undefined;
140 | 3. 코드 실행 (3바퀴)
141 | - var title = "JS BOOk";
142 | - var readBook = function(){};
143 | - getBook();
144 | */
145 | ```
146 |
147 | ```js
148 | case 2:
149 |
150 | function book() {
151 | debugger;
152 | console.log(title);
153 | console.log(readBook);
154 | console.log(getBook);
155 |
156 | var title = 'JS BOOK';
157 | function getBook() {
158 | return title;
159 | }
160 | function readBook() {}
161 | getBook();
162 | }
163 |
164 | book();
165 | >>>
166 | undefined
167 | [Function: readBook]
168 | [Function: getBook]
169 |
170 | /*
171 | 함수 선언식으로 작성할 경우 readBook() 함수 또한 호이스팅에 의해 올라와 undefined가 아닌, 해당 함수를 반환하는 것으로 출력된다.
172 | */
173 | ```
174 |
175 | ```js
176 | function book() {
177 | debugger;
178 |
179 | var title = 'JS BOOK';
180 | const getBook = function () {
181 | return title;
182 | };
183 | const readBook() = function{}
184 | getBook();
185 |
186 | console.log(title);
187 | console.log(readBook);
188 | console.log(getBook);
189 | }
190 |
191 | book();
192 | /*
193 | 함수 표현식으로 작성할 경우 호이스팅이 되지 않으므로, 콘솔 로그를 더 밑에서 선언해줘야 정상적으로 작동한다.
194 | */
195 | ```
196 |
197 | ### 함수 선언문 해석
198 |
199 | 1. 마지막 줄에서 book()함수를 호출합니다.
200 | 2. 엔진 제어가 book 함수의 첫 번쨰 줄로 이동합니다.
201 | 3. 함수 안에서 선언문을 찾습니다.
202 | 4. function getBook(){}이 함수 선언문이므로 function 오브젝트를 생성합니다.
203 | 5. 더 이상 함수 선언문이 없으므로 함수의 첫 번째 줄로 이동합니다.
204 |
205 | ### 변수 초기화
206 |
207 | 6. debugger를 실행하지 않습니다.
208 | 7. var title = "JS BOOK";
209 |
210 | - title 변수에 undefined를 할당합니다
211 |
212 | 8. function getBook(){}은 초기화 했으므로 초기화하지 않습니다.
213 | 9. var readBook = function(){};
214 |
215 | - readBook 변수에 undefined를 할당합니다.
216 | - 함수 표현식은 변수를 선언만 합니다.
217 |
218 | 10. 여기까지가 초기화 단계이며 다시 함수의 첫 번째 줄로 이동합니다.
219 |
220 | ### 코드 실행
221 |
222 | 11. var title ="JS BOOk";
223 |
224 | - title 변수에 "JS BOOk"을 할당합니다.
225 |
226 | 12. function getBook(){return title};
227 |
228 | - 실행이 아닌 선언이므로 다음 줄로 이동
229 |
230 | 13. var readBook = function(){};
231 |
232 | - function 오브젝트를 생성하여 readBook 변수에 할당
233 | - readBook이 function 오브젝트가 되므로 이제 readBook 함수를 호출할 수 있습니다.
234 |
235 | 14. getBook() 함수를 호출합니다.
236 |
237 |
238 |
239 | ## 호이스팅
240 |
241 | 함수 선언문은 초기화 단계에서 function 오브젝트를 생성하므로 어디에서도 함수를 호출할 수 있습니다.
242 | 함수 앞에서 함수를 호출하는 것을 호이스팅이라고 합니다.
243 |
244 | ```js
245 | var result = book();
246 | console.log(result);
247 |
248 | function book() {
249 | return '호이스팅';
250 | }
251 |
252 | >>>
253 | 호이스팅
254 |
255 | /*
256 | JS 엔진은 함수 선언문을 제일 위로 올려 해석하기 때문에 코드 작성을 밑에 해도 오류가 나지 않습니다.
257 | */
258 | ```
259 |
260 | 초기화 단계에서 값이 있으면 초기화하지 않습니다.
261 |
262 | ```js
263 | var result = book();
264 | log(result);
265 |
266 | function book() {
267 | return '호이스팅';
268 | }
269 |
270 | book = function () {
271 | return '함수 표현식';
272 | };
273 |
274 | >>>
275 | 호이스팅
276 | // 오브젝트 안에 정상적인 값 (호이스팅)이 있기 때문에 초기화하지 않았습니다.
277 | ```
278 |
279 |
280 | 다음으로 가기
281 |
--------------------------------------------------------------------------------
/ADVANCE/SECTION03/log.js:
--------------------------------------------------------------------------------
1 | var get = function (one) {
2 | return one;
3 | };
4 |
5 | console.log(get(77, 100));
6 |
7 | var get2 = function () {
8 | console.log('arguments 0 번째 인덱스 호출: ' + arguments[0]);
9 | };
10 |
11 | get2(77);
12 |
13 | var get3 = function () {
14 | console.log('arguments 1 번째 인덱스 호출: ' + arguments[1]);
15 | };
16 |
17 | get3(77, 100);
18 |
--------------------------------------------------------------------------------
/ADVANCE/SECTION03/readme.md:
--------------------------------------------------------------------------------
1 | ## Argument
2 |
3 | ### Arguments 처리 구조
4 |
5 | 파라미터를 {key: value} 형태로 저장
6 |
7 | - 파라미터 수만큼 0부터 인덱스 부여
8 | - key로 사용
9 | - 파라미터로 받은 값을 value에 설정
10 | - {0: param1, 1: param2}
11 |
12 | ```js
13 | function get() {
14 | return arguments;
15 | }
16 | console.log(get('A', 'B'));
17 |
18 | >>>
19 | {0: A, 1: B}
20 | ```
21 |
22 |
23 |
24 | 이러한 구조를 Array-like라함
25 |
26 | - key 값이 0부터 1씩 증가
27 | - length 프로퍼티가 있어야 함
28 | > for 문으로 돌릴 수 있다.
29 |
30 | ### 엔진의 파라미터 처리
31 |
32 | ```js
33 | var get = function (one) {
34 | return one;
35 | };
36 |
37 | console.log(get(77, 100));
38 | >>>
39 | 77
40 | ```
41 |
42 | 1. get() 함수를 호출하면서
43 |
44 | - 77과 100을 파라미터 값으로 넘겨 줍니다.
45 |
46 | 2. 넘겨받은 값을 함수의 파라미터 이름에 설정
47 |
48 | - one : 77
49 |
50 | 3. Arguments 오브젝트를 생성합니다.
51 | 4. 넘겨받은 파라미터 수를
52 |
53 | - Arguments 오브젝트의 length 프로퍼티에 생성
54 |
55 | 5. 넘겨받은 파라미터 수만큼 반복하면서
56 |
57 | - 0부터 key로 하여 순서대로 파라미터 값을 설정
58 | - {0 : 77}, {1 : 100} 형태
59 |
60 | 6. 함수의 초기화 단계에서 실행
61 |
62 | ```js
63 | var get = function (one) {
64 | return one;
65 | };
66 |
67 | console.log(get(77, 100)); >>> 77
68 |
69 | var get2 = function () {
70 | console.log('arguments 0 번째 인덱스 호출: ' + arguments[0]);
71 | };
72 |
73 | get2(77); >>> arguments 0 번째 인덱스 호출: 77
74 |
75 | var get3 = function () {
76 | console.log('arguments 1 번째 인덱스 호출: ' + arguments[1]);
77 | };
78 |
79 | get3(77, 100); arguments 1 번째 인덱스 호출: 100
80 | ```
81 |
82 |
83 | 다음으로 가기
84 |
--------------------------------------------------------------------------------
/ADVANCE/SECTION04/binding.js:
--------------------------------------------------------------------------------
1 | function book() {
2 | debugger;
3 | var point = 100;
4 | function add() {
5 | point += 200;
6 | }
7 | function get() {
8 | return point;
9 | }
10 | add();
11 | console.log(get());
12 | }
13 |
14 | book();
15 |
--------------------------------------------------------------------------------
/ADVANCE/SECTION04/readme.md:
--------------------------------------------------------------------------------
1 | ## 스코프(Scope)
2 |
3 | ### 스코프 목적
4 |
5 | 스코프는 범위, 영역이라는 의미
6 |
7 | 범위를 제한하여
8 |
9 | - 식별자를 해결하려는 것
10 | - 스코프에서 식별자를 해결
11 |
12 | 식별자 해결(Identifier Resolution)
13 |
14 | - 변수 이름, 함수 이름을 찾는 것
15 | - 이때 스코프를 사용
16 | - 이름을 찾게 되면 값을 구할 수 있음
17 | - 크게는 이름을 설정하는 것도 식별자 해결
18 |
19 | 스코프는 식별자 해결을 위한 것
20 |
21 | ### 스코프 설정
22 |
23 | ```js
24 | function book(){
25 | var point = 123;
26 | functino get(){
27 | console.log(point);
28 | };
29 | get();
30 | };
31 | book();
32 |
33 | /*
34 | get 함수가 속한
35 | - var point
36 | - function get(){ ...}
37 | - get();
38 |
39 | 이 코드의 영역을 스코프로 설정합니다.
40 | */
41 | ```
42 |
43 |
44 |
45 | ## 글로벌 스코프
46 |
47 | 글로벌 오브젝트가 글로벌 스코프이다.
48 |
49 | 오브젝트는 개발자 관점으로 오브젝트에 함수와 변수를 작성
50 |
51 | 스코프는 식별자 해결을 위한 것으로
52 |
53 | - 엔진 관점
54 |
55 | 글로벌 스코프는 최상위 스코프
56 |
57 | - 함수에서 보면 최종 스코프
58 |
59 |
60 |
61 | ## 스코프 바인딩
62 |
63 | ### 바인딩이란?
64 |
65 | 구조적으로 결속된 상태로 만드는 것
66 |
67 | - 대상: 프로퍼티 이름 {key : value} 중 key 값
68 |
69 | 바인딩 목적
70 |
71 | - 스코프 설정, 식별자 해결
72 |
73 | 바인딩 시점 구분
74 |
75 | - 정적 바인딩(Lexical, Static Binding)
76 | - 동적 바인딩(Dynamic Binding)
77 |
78 | ### 정적, 동적 바인딩
79 |
80 | 정적 바인딩
81 |
82 | - 초기화 단계에서 바인딩
83 | - 함수 선언문 이름을 바인딩
84 | - 표현식(변수, 함수) 이름을 바인딩
85 | JS는 대부분 정적 바인딩
86 |
87 | 동적(다이나믹) 바인딩
88 |
89 | - 실행할 때 바인딩
90 | - eval(), with 문
91 |
92 | ### 바인딩 시점의 중요성
93 |
94 | 바인딩할 때 스코프가 결정되기 때문에 바인딩 시점이 중요하다
95 | function 오브젝트 생성 지점에 스코프 결정
96 |
97 | - 스코프를 function 오브젝트의 [[Scope]]에 설정
98 | - 스코프가 변경되지 않음
99 |
100 | 함수 안의 모든 함수의 스코프가 같음
101 |
102 | ```js
103 | function book() {
104 | debugger;
105 | var point = 100;
106 | function add() {
107 | point += 200;
108 | }
109 | function get() {
110 | return point;
111 | }
112 | add();
113 | console.log(get());
114 | }
115 |
116 | book();
117 | >>>
118 | 300
119 | /*
120 | add() 함수를 만드는 시점에 [[Scope]] 를 설정하기 때문에 point 변수를 공유할 수 있게 됨
121 | */
122 | ```
123 |
124 |
125 | 다음으로 가기
126 |
--------------------------------------------------------------------------------
/ADVANCE/SECTION04/scope.js:
--------------------------------------------------------------------------------
1 | var value = 100;
2 | function book() {
3 | var point = 200;
4 | return value;
5 | }
6 | console.log(book());
7 |
8 | var value = 100;
9 | const book2 = function () {
10 | var point = 200;
11 | return value;
12 | };
13 | console.log(book2);
14 |
--------------------------------------------------------------------------------
/ADVANCE/SECTION05/readme.md:
--------------------------------------------------------------------------------
1 | ## this
2 |
3 | ### this 개요
4 |
5 | 키워드
6 |
7 | `obj.name()` 형태로 호출한
8 |
9 | - 함수(메소드)에서 this로 인스턴스(오브젝트)를 참조
10 |
11 | 실행 콘텍스트의 this 바인딩 컴포넌트에 바인딩
12 |
13 | ### this와 글로벌 오브젝트
14 |
15 | 글로벌 오브젝트에서 this는 글로벌 오브젝트 참조
16 |
17 | this와 window 오브젝트
18 |
19 | > window는 JS에서 만든 것이 아니며 글로벌 오브젝트의 스코프도 아님
20 | > window와 글로벌 오브젝트를 같은 선상에서 사용
21 |
22 |
23 |
24 | 글로벌 오브젝트에 코드 작성
25 |
26 | ```js
27 | case 1:
28 | window.onload = function () {
29 | // 이 안이 아니라 밖에 코드를 작성
30 | };
31 |
32 | // function과 돌일한 스코프를 가지는 이 부분에 작성
33 | ```
34 |
35 | 1. this가 window 참조
36 |
37 | ```js
38 | console.log(this === window);
39 | // 값과 타입이 모두 같다는 뜻
40 | >>> true
41 | ```
42 |
43 | 2. this가 글로벌 변수 사용
44 |
45 | ```js
46 | var value = 100; // value는 글로벌 변수
47 | console.log(this.value); // this를 통해 글로벌 변수 value에 접근함
48 | >>>
49 | 100
50 | ```
51 |
52 | 3. window로 글로벌 변수 사용
53 |
54 | ```js
55 | var value = 100;
56 | console.log(window.value);
57 |
58 | >>>
59 | 100
60 |
61 | /*
62 | window 오브젝트가 글로벌 오브젝트를 참조하므로, this와 같은 형태로 사용된다.
63 | */
64 | ```
65 |
66 | 4. this.value = 100; 형태로 값 할당
67 |
68 | ```js
69 | this.value = 100;
70 | console.log(window.value);
71 | >>>
72 | 100
73 | /*
74 | window 오브젝트와 같이 다른 오브젝트를 마치 내것처럼 사용하는 개념을 'Host 오브젝트'라고 하비다.
75 | DOM 오브젝트도 Host 오브젝트입니다.
76 | */
77 | ```
78 |
79 |
80 |
81 | window.onload function 안에 코드를 작성
82 |
83 | ```js
84 | case 2:
85 | window.onload = function () {
86 | // function과 돌일한 스코프를 가지는 이 부분에 작성
87 | };
88 | ```
89 |
90 | 1. this가 window 참조
91 |
92 | ```js
93 | window.onload = function () { // window.onload 에서 window를 함수 내부에서 참조 가능하다는 의미
94 | console.log(this === window);
95 | };
96 |
97 | >>>
98 | true
99 |
100 | /*
101 | onload 도 function 오브젝트이므로, onload 앞에 작성한 window를 this로 참조할 수 있다.
102 | */
103 | ```
104 |
105 | 2. this로 지역 변수 사용
106 |
107 | ```js
108 | window.onload = function () {
109 | var value = 100;
110 | console.log(this.value); // console.log(value) 와 같이 onload의 지역변수인 value만 선언했다면 값이 나왔을 것
111 | }; // 하지만 this를 붙인 관계로 window 오브젝트를 참조하였기 때문에 식 밖의 value가 선언되지 않았으므로, undefined 반환
112 |
113 | >>>
114 | undefined
115 | /*
116 | 여기서 this는 window 오브젝트를 참조하고,
117 | value는 onload 함수의 지역변수이다.
118 | 만약
119 | */
120 | ```
121 |
122 | 3. this.value = 100; 형태로 값 할당
123 |
124 | ```js
125 | window.onload = function () {
126 | this.value = 100;
127 | console.log(this.value);
128 | };
129 |
130 | >>>
131 | 100
132 | /*
133 | this.value 로 작성하였으므로 이 this가 window 오브젝트를 참조하여, 100을 출력할 수 있었다.
134 | */
135 | ```
136 |
137 | 함수가 되든 이벤트 핸들러 함수가 되든, 함수의 앞에 작성한 오브젝트를 this 객체가 참조한다.
138 |
139 |
140 |
141 | this 참조 오브젝트
142 |
143 | ```js
144 | var book = {
145 | point: 100,
146 | member: {
147 | point: 200,
148 | get: function () { // get() 내부의 함수에서 사용되는 this는 get() 함수의 바로 위인 member 오브젝트를 참조한다.
149 | console.log(this === book.member);
150 | console.log(this.point);
151 | },
152 | },
153 | };
154 | book.member.get();
155 |
156 | >>>
157 | true
158 | 200
159 |
160 | /*
161 | 🌟 book.member.get() : get()함수는 this 참조를 member 오브젝트 내의 프로퍼티들을 참조한다. 🌟
162 | get() 내부의 함수에서 사용되는 this는 get() 함수의 자신을 호출한 바로 앞의 오브젝트 (여기서는 member)를 참조한다.
163 | 따라서 member 스코프 내에 존재하는 point에 접근하여 값을 반환할 수 있게 되었다.
164 | */
165 | ```
166 |
167 | 정리 시간
168 |
169 | ```js
170 | function getTitle() {
171 | console.log('HTML BOOK');
172 | }
173 | var book = function () {
174 | function getTitlte() {
175 | console.log('JS BOOK');
176 | }
177 | this.getTitle();
178 | getTitle();
179 | };
180 | book();
181 |
182 | >>>
183 | HTML BOOK
184 | JS BOOK
185 |
186 | /*
187 | 1. book() 호출, book() 함수에 오브젝트가 없기 때문에 this는 window를 참조
188 | 2. this.getTitle() 호출시, window.getTitle()과 동일하기 때문에 >> HTML BOOK 출력
189 | 3. getTilte() 호출시, 현재 실행 영역에서 선언적 환경 레코드가 있는 function getTilte()를 먼저 호출 >> JS BOOK 출력
190 | */
191 | ```
192 |
193 |
194 |
195 |
196 | 다음으로 가기
197 |
--------------------------------------------------------------------------------
/ADVANCE/SECTION05/test.js:
--------------------------------------------------------------------------------
1 | var book = {
2 | point: 100,
3 | member: {
4 | point: 200,
5 | get: function () {
6 | console.log(this === book.member);
7 | console.log(this.point);
8 | },
9 | },
10 | };
11 | book.member.get();
12 |
--------------------------------------------------------------------------------
/ADVANCE/SECTION05/this.js:
--------------------------------------------------------------------------------
1 | /*
2 | this의 값은 함수를 '호출하는 방법'에 의해 결정된다. (선언이 아닌 호출될 때)
3 |
4 | 호출한 놈 === 객체
5 | (this)
6 | */
7 |
8 | var someone = {
9 | name: "Junhee Lee",
10 | whoAmI: function () {
11 | console.log(this);
12 | },
13 | };
14 |
15 | someone.whoAmI();
16 |
17 | var what = someone.whoAmI;
18 | what();
19 |
--------------------------------------------------------------------------------
/ADVANCE/SECTION06/closer.js:
--------------------------------------------------------------------------------
1 | var global = "global scope";
2 |
3 | function outer() {
4 | var a = 10;
5 | var b = "B";
6 |
7 | function inner() {
8 | var a = 1;
9 | console.log(a); // inner 내부 스코프
10 | console.log(b); // outer 내부, 형제 스코프
11 | console.log(global); // global로 선언됨, 글로벌 스코프
12 | }
13 | inner();
14 | }
15 |
16 | outer();
17 |
18 | /*
19 | 클로저 - 함수가 생성된 시점의 스코프 체인을 모두 들고 있는다. 지우지 않고 기억한다.
20 |
21 | 1. outer() 호출
22 | 2. outer function 내부 탐색 inner() 발견,
23 | 3. outer() 함수 내의 inner() 호출
24 | 4. inner() 함수 내부 탐색을 통해 console.log 실행
25 | 5. 이렇게 스크립트가 위에서부터 내려오면서 읽었던 값을 계속 들고 있기 때문에
26 | 6. 최종적으로 inner()함수 내부에서도 그 상위 스코프에 접근하여 값을 투력할 수 있다.
27 |
28 |
29 | */
30 |
--------------------------------------------------------------------------------
/ADVANCE/SECTION06/readme.md:
--------------------------------------------------------------------------------
1 | ## 논리적 정리
2 |
3 | ### 프로퍼티 연동 방지
4 |
5 | 1. Object에 Object를 할당하면 프로퍼티 값이 연동됩니다.
6 |
7 | ```js
8 | var origin = { member: 100 };
9 | var dup = origin;
10 | dup.member = 200;
11 | console.log(origin.member);
12 |
13 | >>>
14 | 200
15 |
16 |
17 | /*
18 | 오브젝트를 할당하면 값을 공유하는 성질
19 | */
20 | ```
21 |
22 | 2. 배열도 마찬가지로 연동됩니다.
23 |
24 | ```js
25 | var origin = [1, 2, 3];
26 | var dup = origin;
27 | dup[1] = 200;
28 | console.log(origin);
29 |
30 | >>>
31 | [1, 200, 3]
32 | /*
33 | 배열도 마찬가지로 배열을 할당하면 값을 공유(연동)합니다.
34 | */
35 | ```
36 |
37 | 3. 연동 방지 : 프로퍼티 단위로 할당
38 |
39 | ```js
40 | var origin = { member: 100 };
41 | var dup = {};
42 | for (var name in origin) {
43 | dup[name] = origin[name];
44 | }
45 | dup.member = 200;
46 | console.log(origin.member);
47 | console.log(dup.member);
48 |
49 | >>>
50 | 100
51 | 200
52 | ```
53 |
54 |
55 |
56 | ## 클로저
57 |
58 | function 오브젝트를 생성할 때 함수가 속한 스코프를 [[Scope]]에 설정하고
59 | 함수가 호출되었을 때 [[Scope]]의 프로퍼티를 사용하는 메커니즘
60 | [[Scope]]의 설정과 사용 방법을 이해하면 클로저는 단지 논리적인 설명이다
61 |
62 | ### 클로저 논리 전개
63 |
64 | ```js
65 | function book() {
66 | var point = 100;
67 | var getPoint = function (params) {
68 | point = point + param;
69 | return point;
70 | };
71 | return getPoint;
72 | }
73 | var obj = book();
74 | console.log(obj(200));
75 |
76 | >>>
77 | 300
78 | ```
79 |
80 |
81 | 처음으로 가기
82 |
--------------------------------------------------------------------------------
/ADVANCE/image/executingContext.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/ADVANCE/image/executingContext.png
--------------------------------------------------------------------------------
/ADVANCE/readme.md:
--------------------------------------------------------------------------------
1 | # 🌟자바스크립트 개념 정리하기 (중고급)🌟
2 |
3 | ### 👉🏼 섹션 1, JS 엔진 관점의 핵심키워드 바로가기
4 |
5 | ### 👉🏼 섹션 2, JS 코드 처리 바로가기
6 |
7 | ### 👉🏼 섹션 3, Arguments 바로가기
8 |
9 | ### 👉🏼 섹션 4, Scope 바로가기
10 |
11 | ### 👉🏼 섹션 5, this 바로가기
12 |
13 | ### 👉🏼 섹션 6, 클로저 바로가기
14 |
--------------------------------------------------------------------------------
/BASIC/CallStack.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
28 | Call Stack
29 |
30 |
31 |
32 | 위와 같은 상황에서 에러는 어디서 먼저 발생할까요?
33 | Call Stack 에 대한 개념이 잡혀있다면 어렵지 않은 문제입니다.
34 |
35 |
36 |
--------------------------------------------------------------------------------
/BASIC/Error.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 오류 전파
8 |
30 |
31 |
32 | 오류 전파
33 |
34 |
--------------------------------------------------------------------------------
/BASIC/SECTION01/readme.md:
--------------------------------------------------------------------------------
1 | # SECTION 1, 기본 문법
2 |
3 | ## 🌟 문장
4 |
5 | ### Statement
6 |
7 | JS 코드 실행 단위
8 | 세미콜론 (;) 까지 하나의 문장
9 | var book = "책";
10 |
11 | ### 문장 시작 위치
12 |
13 | 위치 제약 없음
14 | 들여쓰기: 일반적으로 2칸, 4칸
15 |
16 |
17 |
18 | ## 🌟 변수
19 |
20 | ### Variable
21 |
22 | 값을 저장하는 영역
23 |
24 | ### 변수 사용 목적
25 |
26 | 변수에 저장된 값의 재사용
27 |
28 | ### 변수 선언 방법
29 |
30 | ```js
31 | var book;
32 | ```
33 |
34 | ### 값을 변수에 할당하는 방법
35 |
36 | ```js
37 | var book = '책';
38 |
39 | >> '=' 오른쪽의 값(책)을 왼쪽 변수(book)에 할당
40 | >> book 변수를 통해 '책'이라는 값을 재사용
41 | ```
42 |
43 | ## 🌟 데이터 타입
44 |
45 | ### 데이터 타입 형태
46 |
47 | ```js
48 | 숫자 타입 : var value = 123;
49 | 문자 타입 : var value = "sports";
50 | ```
51 |
52 | ### typeof 연산자
53 |
54 | 데이터(값) 타입 변환
55 | typeof value에 데이터를 작성
56 |
57 | ### 키워드 (Keyword)
58 |
59 | 특별한 기능을 가진 단어
60 |
61 | ### 데이터 타입을 자료형이라고도 부름
62 |
63 | ### 데이터는 타입을 가짐
64 |
65 | JS는 데이터를 기준으로 타입을 결정
66 | 타입을 먼저 선언하고 타입에 맞는 데이터를 할당하지 않음
67 |
68 |
69 |
70 | ## 🌟 Number 타입, String 타입
71 |
72 | ### 언어 타입과 스펙 타입
73 |
74 | #### 언어 타입
75 |
76 | JS 프로그램에서 사용할 수 있는 타입
77 | Undefined, Null, Boolean, String, Number, Object
78 |
79 | #### 스펙(문서)타입
80 |
81 | 언어 알고리즘을 위한 타입으로 JS 프로그램에서 사용 불가
82 | Reference, List, Completion, Property Descriptor, Data Block, ...
83 |
84 | ### Number 타입
85 |
86 | 부호(+, -)를 가진 값
87 | 숫자 값 범위
88 | Number 타입의 특수한 3개 값
89 |
90 | - NaN: Not-a-Number (숫자가 아닙니다.)
91 | - Infinity: 양수 무한대
92 | - -Infinity: 음수 무한대
93 |
94 | ```js
95 | const result = 1 * "A";
96 | console.log(result);
97 |
98 | ...
99 |
100 | >>> NaN
101 | ```
102 |
103 | ### String 타입
104 |
105 | 문자 타입
106 | 값을 " " 또는 ' '사이에 작성
107 |
108 | ## 🌟 Undefined 타입, Null 타입
109 |
110 | ### Undefined 타입
111 |
112 | 변수의 디폴트값
113 |
114 | ```js
115 | var point;
116 | console.log(point);
117 | ...
118 | >>> undefined why? 변수를 선언했는데, 변수 안에 값이 들어있지 않기 때문에
119 | ```
120 |
121 | 변수를 선언만 한 것으로 undefined가 초깃값으로 설정
122 | 변수에 undefined 할당 가능
123 |
124 | ### Null 타입
125 |
126 | null과 undifined 차이
127 |
128 | - undefined는 단지 변수만 선언
129 |
130 | ```js
131 | var point;
132 | ```
133 |
134 | - null을 할당해야 값이 null이 됨
135 | - null을 선언한다면, 의도적으로 값을 할당한 것으로 코드를 수행한 것이 된다.
136 |
137 | ```js
138 | var point = null;
139 | console.log(point);
140 | ...
141 | >>> null why? 변수 point에 null이라는 값을 선언했음
142 | ```
143 |
144 | ## 🌟 Boolean 타입, Object 타입
145 |
146 | ### Boolean 타입
147 |
148 | 불리언 타입
149 |
150 | - 값: true, false
151 |
152 | ### Object 타입
153 |
154 | 오브젝트 타입
155 |
156 | - 오브젝트 형태
157 | ```js
158 | {
159 | name: value;
160 | }
161 | 형태;
162 | ```
163 | - 프로퍼티(property)
164 |
165 | ```js
166 | {키 : 값} 으로 구성된 객체 1개
167 | ```
168 |
169 | - Object는 프로퍼티의 집합
170 |
171 | ```js
172 | var book = {
173 | title: '책',
174 | page: 223,
175 | };
176 |
177 | console.log(book);
178 | ...
179 | >>> {title: "책", page: 223}
180 | ```
181 |
182 |
183 | 다음 섹션으로
184 |
--------------------------------------------------------------------------------
/BASIC/SECTION01/typeof.js:
--------------------------------------------------------------------------------
1 | var point = new Number(3);
2 |
3 | console.log(typeof point);
4 | // valueOf()는 빌트인 오브젝트인 Number 오브젝트의 프로토타입 함수 중 하나이다.
5 | /**
6 | * 프로토타입은 new 생성자를 통해 인스턴스를 만들었을 때 Number 객체의 인스턴스(3)를
7 | * 변수 point에 할당하면서 사용이 가능해진다.
8 | * */
9 | console.log(point.valueOf());
10 | console.log((StringPoint = point.toString()));
11 | console.log((value = StringPoint + '6'));
12 |
13 | console.log(typeof StringPoint);
14 |
15 | var point2 = null;
16 |
17 | console.log(typeof point2);
18 |
--------------------------------------------------------------------------------
/BASIC/SECTION02/readme.md:
--------------------------------------------------------------------------------
1 | # SECTION 2, 연산자
2 |
3 | ## 🌟 연산자 (Operator)
4 |
5 | ### 연산자
6 |
7 | 연산의 사전적 의미
8 |
9 | - 규칙에 따라 계산하여 값을 구함
10 |
11 | 연산자 형태
12 |
13 | - +, -, '\*', /, %
14 | - '>', >=, '<', <=
15 | - ==, !=, ===, !==
16 | - (,), typeof, delete, void
17 | - Instanceof, in new 등
18 |
19 | ### 표현식
20 |
21 | 표현식 형태
22 |
23 | ```js
24 | 1 + 2;
25 | var total = 1 + 2;
26 | var value = total / (2 + 3);
27 | ```
28 |
29 | "표현식을 평가"한다고 한다.
30 | 표현식을 평가하면 결과가 반환되며, 이를 '평가 결과'라고 한다.
31 |
32 |
33 |
34 | ## 🌟 관계 연산자
35 |
36 | ```js
37 | <,>, <=, >= 연산자
38 | instanceof 연산자
39 | in 연산자
40 | ```
41 |
42 | instanceof, in 연산자
43 |
44 | - 사전 설명이 필요하므로 관련된 곳에서 다룸
45 |
46 |
47 |
48 | ## 🌟 동등, 부등, 일치, 불일치 연산자
49 |
50 | ### == 연산자
51 |
52 | 동등 연산자
53 | 왼쪽과 오른쪽 값이 같으면 true 다르면 false
54 | 타입은 비교하지 않음
55 |
56 | ```js
57 | console.log(1 == "1");
58 |
59 | >>> true
60 |
61 | why?
62 | js는 숫자 : 문자 비교일 때 숫자타입으로 변환하여 비교 연산함
63 | 따라서 값이 같기 때문에 true로 결과물 출력
64 | ```
65 |
66 | ### != 연산자
67 |
68 | 부등 연산자
69 | 왼쪽과 오른쪽 값이 다르면 true 같으면 false
70 |
71 | ### === 연산자
72 |
73 | 일치 연산자
74 | 왼쪽과 오른쪽의 값과 타입이 모두 같으면 true 값 또는 타입이 다르면 false
75 |
76 | ```js
77 | 1 === 1, true
78 | 1 === "1", false
79 |
80 | why? 숫자 : 문자 비교로 타입이 다르므로 일치 연산자에서는 false로 추력됨
81 |
82 | ```
83 |
84 | ```js
85 | var value;
86 | console.log(value == null); >>> true
87 | console.log(value === null); >>> false
88 |
89 | why?
90 | 변수 value의 상태는 undefined이다.
91 | undifined와 null은 "값"이다.
92 | 일치 연산자로 비교하면 타입이 다르므로 false로 출력된다.
93 | ```
94 |
95 |
96 |
97 | ## 🌟 조건 연산자
98 |
99 | ### 조건 연산자
100 |
101 | 3항 연산자라고도 한다.
102 |
103 | ```js
104 | exp ? exp - 1 : exp - 2;
105 | ```
106 |
107 | exp 위치의 표현식을 먼저 평가
108 |
109 | - true 이면 exp-1의 결과를 반환
110 | - false 이면 exp2의 결과를 반환
111 |
112 | exp 표현식 기준이므로 true 라면 뒤에 false 표현식을 건너 뛴다.
113 |
114 |
115 |
116 | 다음 섹션으로
117 |
--------------------------------------------------------------------------------
/BASIC/SECTION03/homework.js:
--------------------------------------------------------------------------------
1 | var holSum = 0;
2 | var zakSum = 0;
3 | var resultSum = 0;
4 |
5 | for (var k = 1; k < 51; k++) {
6 | if (k % 2 == 1) {
7 | holSum += k;
8 | } else if (k % 2 == 0) {
9 | zakSum += k;
10 | }
11 | }
12 | console.log('홀수 합계' + holSum);
13 | console.log('짝수 합계' + zakSum);
14 | resultSum = holSum + zakSum;
15 | console.log(resultSum);
16 |
--------------------------------------------------------------------------------
/BASIC/SECTION03/homework2.js:
--------------------------------------------------------------------------------
1 | for (var k = 1; k < 5; k++) {
2 | if (k % 2 == 1) {
3 | break;
4 | }
5 | }
6 | console.log(k);
7 |
--------------------------------------------------------------------------------
/BASIC/SECTION03/readme.md:
--------------------------------------------------------------------------------
1 | # SECTION 3, 문장
2 |
3 | ## 🌟 문장 (Statement)
4 |
5 | ### 문장
6 |
7 | 형테 : ;(세미콜론)
8 | 문장을 끝나게 하는 역할
9 |
10 | ```js
11 | var book = '책';
12 | ```
13 |
14 | ### 화이트 스페이스
15 |
16 | 사람 눈에 보이지 않는 문자
17 |
18 | - enter, space bar, ...
19 | - 가독성을 위한 것
20 | - 문자마다 기능을 갖고 있음
21 |
22 | ### 블록 (중괄호)
23 |
24 | 형태 : { 문장 리스트 opt}
25 | 중괄호 { }
26 |
27 | - 실행 그룹으로
28 | - 블록 안의 모든 문장 실행
29 |
30 | 문장 리스트
31 |
32 | - { } 안의 모든 문장
33 | - 문장 리스트 작성은 선택 ( 필수 x)
34 |
35 |
36 |
37 | ## 🌟 if, debugger
38 |
39 | ### if
40 |
41 | 형태
42 |
43 | - if(표현식) 문장1
44 | - if(표현식) 문장1 else 문장2
45 |
46 | 조건에 따른 처리
47 |
48 | - 먼저 표현식을 평가
49 | - 평가 결과를 true/false로 변환
50 | - true 이면 문장1 실행
51 | - false이면 문장2 실행
52 |
53 | ### debugger
54 |
55 | debugger 위치에서 실행을 멈춥니다.
56 |
57 | - 브라우저의 개발자 도구 창이 열려있을 때만 멈춤
58 | - ES5부터 지원
59 |
60 | ```js
61 | 'use strict'; // 더 강력한 자바스크립트 문법을 지원해줘라
62 |
63 | debugeer;
64 |
65 | var sports = '스포츠';
66 | console.log(sports);
67 | ```
68 |
69 |
70 |
71 | ## 🌟 while, do-while
72 |
73 | ### while
74 |
75 | 표현식의 평가 결과가 false가 될 때까지 문장을 반복하여 실행
76 |
77 | ```js
78 | var k = 1;
79 |
80 | while (k < 3) {
81 | console.log(k);
82 | k++;
83 | }
84 |
85 | ...
86 | >>> 1, 2
87 | ```
88 |
89 | ### do-while
90 |
91 | 처리 방법은 while문과 같지만, do 문을 먼저 실행
92 |
93 | ```js
94 | var k = 0;
95 | do {
96 | console.log('do:', k);
97 | k++;
98 | } while (k < 3);
99 | {
100 | console.log('while:', k);
101 | }
102 |
103 | ...
104 |
105 | >>>
106 | do: 0
107 | do: 1
108 | do: 2
109 | while: 3
110 | ```
111 |
112 | 평가 결과가 false일 때(k = 3 이 되어 더이상 조건문이 true가 아닐 때), do 문으로 넘어가지 않고, console.log('while')문으로 넘어감
113 |
114 |
115 |
116 | ## 🌟 for 문
117 |
118 | 형태: for(초깃값opt; 비교opt; 증감opt) { 문장 }
119 | 2번째의 비교 표현식의 평가 결과가 true인 동안 문장을 반복 실행
120 |
121 | ```js
122 | for(var k=0; k<2; k++){
123 | console.log(k);
124 | }
125 |
126 | >>>
127 | 0
128 | 1
129 | ```
130 |
131 | ### for() 옵션
132 |
133 | 형태: for(초깃값opt; 비교opt; 증감opt) { 문장 }
134 | 형태에서 opt는 생략 가능
135 |
136 | ```js
137 | case1 : 증감 생략
138 |
139 | for(var k =0; k<3){
140 | console.log(k);
141 | k++;
142 | }
143 |
144 | ...
145 | >>>
146 | 0
147 | 1
148 | 2
149 |
150 | ```
151 |
152 |
153 |
154 | ## 🌟 break, continue
155 |
156 | ### break
157 |
158 | 형태:
159 | break;
160 | break 식별자;
161 |
162 |
163 |
164 | 반복문 종료
165 |
166 | ```js
167 | for(var k =0; k=5; k++){
168 | if(k % 2 == 1){
169 | break;
170 | }
171 | }
172 | console.log(k);
173 | ...
174 | >>> 1
175 |
176 | 1은 조건(2로 나눴을 때 나머지가 1인 수, 홀수)을 만족하는 가장 빠른 정수이다.
177 | ```
178 |
179 |
180 | for, for~in, while, do~while, switch 문 등에서 사용
181 |
182 | ### continue
183 |
184 | 형태:
185 | continue;
186 | continue 식별자;
187 |
188 |
189 |
190 | 반복문의 처음으로 분기
191 |
192 | ```js
193 | for(var k=0; k<5; k++){
194 | if(k===2 || k ===3){
195 | continue;
196 | }
197 | console.log(k);
198 | }
199 | ...
200 | >>>
201 | 0
202 | 1
203 | 4
204 | console.log를 만나지 못하고 반복문으로 되돌아가게 하는 'continue'
205 | ```
206 |
207 |
208 |
209 | ## 🌟 strict 모드
210 |
211 | 형태: "use strict"
212 | 엄격하게 JS 문법 사용의 선언
213 | 작성한 위치부터 적용
214 | ES5부터 지원
215 |
216 |
217 | 다음 섹션으로
218 |
--------------------------------------------------------------------------------
/BASIC/SECTION04/readme.md:
--------------------------------------------------------------------------------
1 | # SECTION 4, 함수
2 |
3 | ## 🌟 함수 (function)
4 |
5 | function
6 |
7 | - 특정 기능을 처리하는 자바스크립트 코드 묶음
8 |
9 | 함수형태
10 |
11 | ```js
12 | CASE1: 함수 선언식
13 |
14 | function book() {
15 | var title = 'JS BOOK';
16 | }
17 |
18 |
19 | CASE2: 함수 표현식
20 |
21 | var point = function (one, two) {
22 | var total = one + two;
23 | var bonus = total + 100;
24 | };
25 | ```
26 |
27 | 함수 표현식과 함수 선언식 차이점 알아보기
28 |
29 |
30 |
31 | - 함수 선언식은 호이스팅에 영향을 받지만, 함수 표현식은 호이스팅에 영향을 받지 않는다.
32 | - 함수 선언식은 코드를 구현한 위치와 관계없이 자바스크립트의 특징인 호이스팅에 따라 브라우저가 자바스크립트를 해석할 때 맨 위로 끌어 올려진다.
33 |
34 | ### 함수 구성 요소
35 |
36 | function 키워드
37 | 함수 이름
38 | 파라미터 (parameter)
39 |
40 | - 매개 변수, 인자, 아규먼트라고도 부름
41 | - 파라미터 작성은 optional(선택적)
42 |
43 | 함수 Body
44 |
45 | - 중괄호 { ... } 안에 작성한 코드
46 | - 함수 코드, 소스 텍스트로도 부름
47 | - 강좌에서는 함수 코드로 표기
48 | - 함수 코드 작성은 선택
49 |
50 | ### 함수 이름 규칙
51 |
52 | 통용되는 관례를 기준으로 말함
53 |
54 | calculatePoint()처럼 동사로 시작
55 |
56 | - 포인트를 계산한다는 의미
57 |
58 | 두 개 이상의 단어를 사용할 때
59 |
60 | - 두 번째 단어부터 명사 사용
61 | - 명사의 첫 문자를 대문자로 사용
62 | - 낙타등 표기법이라고 부름
63 |
64 | 동사 + 명사 형태로 동적인 모습
65 |
66 |
67 |
68 | ## 🌟 함수 호출
69 |
70 | ### 호출받는 함수
71 |
72 | 함수는 호출되어야 실행됩니다
73 | 호출받는 함수
74 |
75 | - 함수가 호출되었을 때 실행되는 함수
76 | - 함수라고 하면 호출받는 함수를 지칭
77 |
78 | 파라미터
79 |
80 | - 호출한 함수에서 넘겨준 값을 받음
81 | - (one, two)처럼 소괄호() 안에 파라미터 이름 작성
82 |
83 | ```js
84 | function setValue(one, two) {
85 | var total = one + two;
86 | }
87 |
88 | setValue(10, 20);
89 |
90 | ...
91 | setValue(10,20) 함수에 파라미터 두 개(10,20)를 포함한 호출 요청을 보내면 작성된 function setValue(one,two){ ... } 함수를 통해 결과값을 만들어 줍니다.
92 | ```
93 |
94 | 일반적으로 호출 받는 함수는 위에 작성합니다.
95 |
96 | ### return
97 |
98 | 형태 : return 표현식 opt;
99 | 표현식의 평가 결과 반환
100 |
101 | ```js
102 | function getPoint() {
103 | return 10 * 30;
104 | }
105 | var result = getPoint();
106 | console.log(result);
107 | ...
108 |
109 | >>>
110 | 300
111 | ```
112 |
113 | 1. getPoint() 함수 호출
114 | 2. return의 오른쪽 표현식(10\*30)을 평가
115 | 3. 평가 결과 300을 반환
116 | 4. 300을 갖고 getPoint()로 돌아갑니다
117 | 5. 300을 result 변수에 할당합니다.
118 |
119 | return 또는 표현식을 작성하지 않으면 undefined 반환
120 |
121 | ```js
122 | case1: return 또는 표현식을 작성하지 않은 경우
123 |
124 | function getPoint(){};
125 |
126 | var result = getPoint();
127 | console.log(typeof result);
128 |
129 | >>>
130 | undefined
131 | ```
132 |
133 | return과 표현식을 한 줄에 작성
134 |
135 |
136 |
137 | ## 🌟 주석 작성 목적
138 |
139 | 코드가 목적을 달성하기 위한 기능, 시나리오 등을 생각하고 정리하는 것
140 | 코드를 작성하기 전에 우선 먼저 정리한 생각을 주석으로 작성
141 | 주석 작성 기준
142 |
143 | - 코드의 목적, 결과가 미치는 영향을 작성
144 | - 다른 사람이 알 수 있도록 자세하게 작성
145 |
146 |
147 |
148 | 다음 섹션으로
149 |
--------------------------------------------------------------------------------
/BASIC/SECTION05/readme.md:
--------------------------------------------------------------------------------
1 | # SECTION 5, 오브젝트
2 |
3 | ## 🌟 프로퍼티(Property)
4 |
5 | Propery
6 |
7 | - {name: value} 형태
8 |
9 | name에 프로퍼티 이름/키를 작성
10 |
11 | - 따옴표 작성 생략
12 |
13 | ```js
14 | var book = {
15 | title: '책',
16 | point: {
17 | ten: 10,
18 | bonus: 200,
19 | promotion: function () {},
20 | },
21 | };
22 | ```
23 |
24 | value에 JS에서 지원하는 타입 작성
25 |
26 | - {a: 123, b: "ABC", c: true, d: {}}
27 | - {book: function(){...}}
28 |
29 | 오브젝트(Object)를 객체라고 부르지만
30 |
31 | - 뉘앙스가 다르며, 강좌에서는 오브젝트로 표기
32 | - 오브젝트와 객체 구분이 필요할 때, 별도 표기
33 |
34 | 🌟 객체는 실체가 없이 개념만으로 통용될 수 있음
35 | 🌟 하지만, 오브젝트는 반드시 프로퍼티를 가지고 있음
36 |
37 | ### !🌟 프로퍼티 추가, 변경 🌟!
38 |
39 | 오브젝트에 프로퍼티 추가, 변경
40 |
41 | 1. var obj = {};
42 | 2. obj.abc = 123;
43 | 3. obj 오브젝트에 프로퍼티 이름으로 abc가 없으면 abc:123이 추가되고, abc가 있으면 프로퍼티 값이 123으로 변경됨
44 |
45 | 작성 방법
46 |
47 | 1. 점(.)과 프로퍼티 이름 사용
48 |
49 | ```js
50 | var book = {};
51 | book.title = "JS BOOK";
52 | book.price = 18900;
53 |
54 | console.log(book);
55 | ...
56 | >>>
57 | { title: JS BOOK, price: 18900 }
58 |
59 | 프로퍼티 형식으로 담겨진 결과물을 확인할 수 있다.
60 | ```
61 |
62 |
63 |
64 | ### object 프로퍼티 열거
65 |
66 | 오브젝트에서 프로퍼티 값 추출
67 |
68 | ```js
69 | var obj = {book : "책"};
70 | var value = obj.book;
71 |
72 | console.log(value);
73 |
74 | ...
75 | >>>
76 | 책
77 | ```
78 |
79 | obj 오브젝트에 프로퍼티 이름인
80 |
81 | - book이 있으면 프로퍼티 값 반환
82 | - book이 없으면 undefined 반환
83 |
84 | ```js
85 | var obj = {book : "책"};
86 | var value = obj.price;
87 |
88 | console.log(value);
89 |
90 | ...
91 | >>>
92 | undefined
93 | ```
94 |
95 | ### for ~ in 문
96 |
97 | 오브젝트에서 프로퍼티를 열거(처음부터 끝까지 모두 읽음)
98 |
99 |
100 |
101 | 형태:
102 | for(변수 in 오브젝트) 문장;
103 | for(표현식 in 오브젝트) 문장;
104 |
105 | ```js
106 | var sports = {
107 | soccer: "축구",
108 | baseball: "야구",
109 | };
110 | for (var item in sports){
111 | log(item); // {key : value} 중 key에 접근
112 | log(sports[item]); // {key : value} 중 value에 접근
113 | }
114 |
115 | ...
116 | >>>
117 | soccer
118 | 축구
119 | baseball
120 | 야구
121 | ```
122 |
123 |
124 |
125 | for (var item in sports){...}
126 |
127 | - 프로퍼티 이름이 item에 설정
128 | - sports[item]으로 프로퍼티 값을 구함
129 | - 프로퍼티를 작성한 순서대로 읽혀진다는 것을 보장하지 않음
130 |
131 | 다음 섹션으로
132 |
--------------------------------------------------------------------------------
/BASIC/SECTION06/readme.md:
--------------------------------------------------------------------------------
1 | # SECTION 6, 빌트인
2 |
3 | ## 🌟 빌트인(Built-in)
4 |
5 | Built-in이란?
6 |
7 | - 값 타입, 연산자, 오브젝트(object)를 사전에 만들어 놓은 것
8 | > 여기서 오브젝트란 해당 오브젝트가 가지는 프로퍼티와 함수들을 의미한다.
9 | - (JS 코드를 처리하는 영역에)
10 |
11 | 장점
12 |
13 | - 사전 처리를 하지 않고 즉시 사용
14 | - 자바스크립트 특징
15 |
16 | 빌트인 값 타입
17 |
18 | - Undefined, Null, Boolean, Number, String, Object
19 |
20 | 빌트인 연산자
21 |
22 | - +, - , \*, /, %, ++, --, new 등
23 |
24 | ### 빌트인 오브젝트
25 |
26 | 빌트인 Number 오브젝트
27 |
28 | - 123과 같은 숫자, 상수, 지수를 처리하는 오브젝트
29 | - 여기서 오브젝트는 소문자 object
30 |
31 | ### object ?
32 |
33 | - (이미 키 : 값 상태로 만들어져 있음)
34 | - data를 처리하는데 중점을 두고 있다.
35 |
36 | ```
37 | 빌트인 Number 오브젝트는
38 | Number 처리를 위한 프로퍼티의 집합입니다.
39 | 즉 Number 처리를 위한 오브젝트입니다.
40 |
41 | JS에서 Number 처리를 위한 프로퍼티를 사전에 만들어 제공하므로
42 | Number.length로 1 이라는 정수를 구할수 있으며,
43 | Number.isNaN()으로 함수를 호출할 수 있습니다.
44 | ```
45 |
46 |
47 |
48 | ## 🌟 빌트인 오브젝트 유형
49 |
50 | 빌트인 오브젝트는 총 11개의 오브젝트가 존재합니다.
51 |
52 | Number 오브젝트
53 |
54 | - 123과 같은 숫자, 상수, 지수
55 |
56 |
57 | String 오브젝트
58 |
59 | - "abc"와 같은 문자열, 분리, 연결
60 |
61 |
62 | Boolean 오브젝트
63 |
64 | - true, false
65 |
66 |
67 | Object 오브젝트
68 |
69 | - {key: value} 형태
70 |
71 |
72 | Array 오브젝트
73 |
74 | - [1, 2, "A", "가나다"] 형태
75 |
76 |
77 | Function 오브젝트
78 |
79 | - function abc(){...} 형태
80 |
81 |
82 | Math 오브젝트
83 |
84 | - abs(), round() 등의 수학 계산
85 |
86 |
87 | Date 오브젝트
88 |
89 | - 연월일, 시분초
90 |
91 |
92 | JSON 오브젝트
93 |
94 | - [{"name" : "value"}] 형태
95 | - 서버와 데이터 송수신에 사용
96 |
97 |
98 | RegExp 오브젝트
99 |
100 | - ^, $와 같은 정규 표현식
101 |
102 |
103 | Global 오브젝트
104 |
105 | - 소스 파일 전체에서 하나만 존재
106 | - 모든 코드에서 공유, 접근 가능
107 | - 전역 객체라고도 하며, 뉘앙스에 차이가 있다
108 |
109 |
110 |
111 | 다음 섹션으로
112 |
--------------------------------------------------------------------------------
/BASIC/SECTION07/readme.md:
--------------------------------------------------------------------------------
1 | ## 🌟 Number 오브젝트
2 |
3 | ### Number 오브젝트
4 |
5 | 숫자(123) 처리를 위한 오브젝트
6 | 즉, Number 오브젝트에
7 |
8 | - 숫자 처리를 위한
9 | - 함수와 프로퍼티가 포함되어 있으며
10 | - 함수를 호출하여 숫자 처리를 하게 됩니다.
11 |
12 | 모든 obejct를 잘 다루기 위해서는 빌트인된 함수와 프로퍼티를 잘 사용할 수 있어야 합니다.
13 |
14 | ### 프로퍼티 리스트
15 |
16 | | 이름(수단) | 개요(목적) |
17 | | :--------------: | :------------------------------------------: |
18 | | new Number() | 인스턴스 생성 |
19 | | Number 함수 |
20 | | Number() | 숫자 값으로 변환하여 반환 |
21 | | Number.prototype | |
22 | | constructor | 생성자 |
23 | | toString() | 숫자 값을 문자열로 변환 |
24 | | toLocaleString() | 숫자 값을 지역화 문자로 변환 |
25 | | valueOf() | 프리미티브 값(인스턴스에 설정된 값)으로 반환 |
26 | | toExponential() | 지수 표기로 변환 |
27 | | toFixed() | 고정 소숫점 표기로 변환 |
28 | | toPrecision() | 고정 소숫점 또는 지수 표기로 변환 |
29 |
30 |
31 |
32 | - ( ) , 소괄호가 있는 것은 함수이다.
33 | - ( ) x , 소괄호가 없는 것은 오브젝트입니다.
34 | - 개요(목적)를 기준으로 접근해야 합니다.
35 | - new Number()는 인스턴스를 생성합니다 x (수단을 위한 목적)
36 | - 인스턴스를 생성하기 위해 new Number()를 사용합니다. (목적을 위한 수단)
37 |
38 |
39 |
40 | ## 🌟 Number 타입으로 변환
41 |
42 | ### Number()
43 |
44 | | 구분 | 데이터(값) |
45 | | :------: | :----------------------------: |
46 | | 파라미터 | 변환할 값 opt (opt, 없어도 됨) |
47 | | 반환 | 변환한 값 |
48 |
49 |
50 |
51 | 파라미터 값을 Number 타입으로 변환
52 | 파라미터 값이 String 타입이라도 값이 숫자이면 변환 가능
53 |
54 | ```js
55 | console.log(Number('123') + 200);
56 |
57 | ...
58 |
59 | >>>
60 | 323
61 | ```
62 |
63 | 숫자로 변환할 수 있으면 변환
64 | 파라미터 값을 작성하지 않으면 0을 반환
65 |
66 | ```js
67 | console.log(Number(0x14));
68 | console.log(Number(true));
69 | console.log(Number(null));
70 | console.log(Number(undefined));
71 |
72 | ...
73 | >>>
74 | 20
75 | 1
76 | 0
77 | NaN
78 | ```
79 |
80 |
81 |
82 | ## 🌟 new 연산자
83 |
84 | | 구분 | 데이터(값) |
85 | | :---------: | :-------------: |
86 | | constructor | 생성자 |
87 | | 파라미터 | 값 opt |
88 | | 반환 | 생성한 인스턴스 |
89 |
90 |
91 |
92 | 오브젝트로 인스턴스를 생성하여 반환
93 |
94 | - 원본을 복사하는 개념
95 | - new 연산자를 사용하면 인스턴스
96 | - 코딩 관례로 첫 문자를 대문자로 작성합니다.
97 |
98 | ```js
99 | var obj = new Number();
100 | log(typeof obj);
101 |
102 | ...
103 | >>>
104 | object
105 |
106 | why?
107 | - new Number()를 통해 만들어진 인스턴스가 obj 변수에 할당됨
108 | ```
109 |
110 |
111 |
112 | 대문자 Object는 {키 : 값} 형태의 집합입니다.
113 | 소문자 object는 인스턴스입니다.
114 |
115 | 인스턴스 생성 목적
116 |
117 | - 인스턴스마다 값을 갖기 위한 것
118 | - 각 변수마다(obj, obj2) 인스턴스의 파라미터(123, 234)를 통해 값을 저장하기 위함
119 |
120 | ```js
121 | var obj = new Number("123");
122 | console.log(obj.valueOf());
123 | var obj2 = new Number("234");
124 | console.log(obj2.valueOf());
125 | ...
126 | >>>
127 | 123
128 | 234
129 | ```
130 |
131 |
132 |
133 | ## 🌟 Number 인스턴스 생성
134 |
135 | ### new Number()
136 |
137 | | 구분 | 데이터(값) |
138 | | :------: | :--------------------: |
139 | | 파라미터 | 값 opt |
140 | | 반환 | 생성한 Number 인스턴스 |
141 |
142 |
143 |
144 | 빌트인 Number 오브젝트로 새로운 Number 인스턴스를 생성
145 |
146 | ```js
147 | // 파라미터 값이 String 타입이여도 Number()함수에 의해 숫자로 저장됩니다.
148 | var obj = new Number("123");
149 |
150 | console.log(obj);
151 |
152 | >>>
153 | 123
154 |
155 | /*
156 | 1. 새로 생성한 Number 인스턴스가 obj에 할당됩니다.
157 |
158 | 2. 오른쪽 Local의 obj를 펼칩니다.
159 | 1) __proto__ 가 있으며
160 | 2) [[PrimitiveValue]] = 123이 있습니다.
161 | */
162 | ```
163 |
164 |
165 |
166 | new Number() 생성자를 통해 생긴 인스턴스입니다.
167 | 파라미터를 통해 인스턴스에 값을 넣어줄 수 있습니다.
168 | 생성된 인스턴스를 변수 obj에 저장합니다.
169 |
170 |
171 | 새롭게 만들어진 인스턴스에는 기존 Object의 prototpye 만을 전달합니다.
172 | 나머지 Object(대문자)의 프로퍼티(함수(), 프로퍼티{키:값})는 주지 않으며, 프로토타입에 연결된 함수들만 사용이 가능합니다.
173 |
174 |
175 |
176 | ## 🌟 프리미티브 값
177 |
178 | Primitive Value
179 |
180 | - 언어에 있어 가장 낮은 단계의 값
181 |
182 | ```js
183 | var book = '책';
184 |
185 | // 위 함수에서 "책"은 더 이상 분해, 전개가 불가능한 프리미티브 값입니다.
186 | ```
187 |
188 |
189 | 프리미티브 타입
190 |
191 | - Number, String, Boolean : 인스턴스 생성 가능
192 | - Null, Undefined: 인스턴스 생성 불가
193 | - Object는 프리미티브 값을 제공하지 않음
194 |
195 | ### 인스턴스의 프리미티브 값
196 |
197 | var obj = new Number(123);
198 |
199 | - 인스턴스를 생성하면
200 | - 파라미터 값을 인스턴스의 프리미티브 값으로 설정
201 |
202 | 프리미티브 값을 갖는 오브젝트
203 |
204 | - Boolean, Date, Number, String
205 |
206 | ### valueOf()
207 |
208 | | 구분 | 데이터(값) |
209 | | :------: | :-------------------: |
210 | | data | Number 인스턴스, 숫자 |
211 | | 파라미터 | 사용하지 않음 |
212 | | 반환 | 프리미티브 값 |
213 |
214 |
215 |
216 | Number 인스턴스의 프리미티브 값 반환
217 |
218 | ```js
219 | var obj = new Number("123");
220 |
221 | console.log(obj.valueOf());
222 |
223 | >>>
224 | 123
225 | /*
226 | data => obj
227 | params => x
228 | return => 123
229 | */
230 | ```
231 |
232 |
233 |
234 | 다음 섹션으로
235 |
--------------------------------------------------------------------------------
/BASIC/SECTION08/string.js:
--------------------------------------------------------------------------------
1 | var valueA = 123;
2 | console.log(typeof valueA);
3 |
4 | var valueB = 'Sports';
5 | var lowerValue = valueB.toLowerCase();
6 | console.log('match 함수 사용 :');
7 | console.log(lowerValue.match(/s/g));
8 |
9 | var value0 = 'ABC';
10 | console.log(value0.length);
11 |
12 | var value = '황준영김';
13 | console.log(value.indexOf('백'));
14 |
15 | var value2 = 'abcabc';
16 | console.log(value2.replace('a', '바꿈'));
17 | console.log(value2.replace(/a/, '바꿈'));
18 | console.log(value2.replace(/a/g, '바꿈'));
19 |
20 | var value3 = 'sports';
21 | var result = value3.concat('축구');
22 | var result2 = result.concat('재밌니?').concat('진짜?');
23 |
24 | console.log(result);
25 | console.log(result2);
26 |
27 | // cd SECTION08
28 | // node string.js 로 콘솔값 확인
29 |
30 | // 존재하지 않으면 -1
31 | // 존재한다면 0 이상의 값 출력
32 |
--------------------------------------------------------------------------------
/BASIC/SECTION09/readme.md:
--------------------------------------------------------------------------------
1 | ## 🌟 Object 오브젝트(ES3 기준)
2 |
3 | ### 자바스크립트의 오브젝트
4 |
5 | 오브젝트 구분
6 |
7 | - 빌트인 오브젝트
8 | - 네이티브 오브젝트
9 | - 호스트 오브젝트
10 |
11 |
12 |
13 | 네이티브 오브젝트 안에 빌트인 오브젝트가 포함되어 있다.
14 |
15 |
16 | ### 빌트인 오브젝트
17 |
18 | - 사전에 만들어 놓은 오브젝트
19 | - Number, String, ...
20 |
21 |
22 |
23 | ### 네이티브 오브젝트
24 |
25 | - JS 스펙에서 정의한 오브젝트
26 | - 빌트인 오브젝트 포함
27 | - JS 코드를 실행할 때 만드는 오브젝트
28 | - 예) Argunment 오브젝트
29 |
30 | ### 호스트 오브젝트
31 |
32 | - 빌트인, 네이티브 오브젝트를 제외한 모든 오브젝트
33 |
34 | > 예 : window, DOM 오브젝트, ...
35 |
36 | - JS는 호스트 환경에서 브라우저의 모든 요소 기술을 연결하고 융합하며 이를 제어
37 |
38 | - 계속해서 host 오브젝트에 포함된 내용들을 공부해야 합니다.
39 |
40 | ```js
41 | var node = document.querySelector('div');
42 | console.log(node.nodeName);
43 |
44 | >>>
45 | DIV
46 |
47 | /*
48 |
49 | document는 DOM에서 제공하는 오브젝트로 HOST 오브젝트라고 불립니다.
50 | 마치 JS 함수처럼 사용이 가능합니다.
51 | */
52 | ```
53 |
54 |
55 |
56 | ## 오브젝트와 인스턴스
57 |
58 | 강좌에서는 오브젝트와 인스턴스를 구분합니다.
59 |
60 | ```js
61 | case 1: 오브젝트
62 |
63 | new 연산자 사용 x
64 |
65 | var obj = {};
66 |
67 | obj 오브젝트라 칭함
68 |
69 | ```
70 |
71 | ```js
72 | case 2: 인스턴스
73 |
74 | new 연산자 사용
75 |
76 | var abc = new Object();
77 |
78 | abc 인스턴스라 칭함
79 | ```
80 |
81 |
82 |
83 | ## 빌트인 Object와 프로퍼티(ES3)
84 |
85 | 오브젝트라 부르는 것이 맞지만, 구분을 위해 프로퍼티라 칭합니다.
86 |
87 | ### 프로퍼티 리스트
88 |
89 | | 이름 | 개요 |
90 | | :--------------------: | :---------------------------------------: |
91 | | new Object() | 파라미터 데이터 타입의 인스턴스 생성 |
92 | | Object() | Object 인스턴스 생성 |
93 | | Object.prototype |
94 | | constructor | 생성자 |
95 | | valueOf() | 프리미티브 값 반환 (인스턴스에 설정된 값) |
96 | | hasOwnProperty() | 프로퍼티 소유 여부 반환 |
97 | | propertyIsEnumerable() | 프로퍼티 열거 여부 반환 |
98 | | IsPrototypeOf() | prototype의 존재 여부 반환 |
99 | | toString() | 문자열로 반환 |
100 | | toLocaleString() | 지역화 문자열로 반환 |
101 |
102 |
103 |
104 | ## Object 인스턴스 생성
105 |
106 | ### new Object()
107 |
108 | | 구분 | 데이터(값) |
109 | | :------: | :-------------: |
110 | | 파라미터 | 값 opt |
111 | | 반환 | 생성한 인스턴스 |
112 |
113 |
114 |
115 | 인스턴스를 생성하여 반환
116 | 파라미터의 데이터 타입에 따라 생성할 인스턴스 결정
117 |
118 | ```js
119 | var newObj = new Object(123);
120 | console.log(typeOf(newObj));
121 | console.log(newObj + 223);
122 |
123 | >>>
124 | object
125 | 323
126 |
127 | why?
128 | /*
129 | 타입은 기본적으로 오브젝트 타입이지만, 파라미터에 따라 프리미티브 값이 형변환되어 적용된다.
130 | */
131 | ```
132 |
133 | 파라미터 값이 undefined, null이면 빈 Object 인스턴스 반환
134 |
135 | ```js
136 | var newObj = new Object();
137 | console.log(newObj);
138 |
139 | >>>
140 | {}
141 | ```
142 |
143 | ### Object()
144 |
145 | | 구분 | 데이터(값) |
146 | | :------: | :-------------: |
147 | | 파라미터 | 값 opt |
148 | | 반환 | 생성한 인스턴스 |
149 |
150 |
151 |
152 | Object 인스턴스 생성
153 | 파라미터는 {name : value} 형태
154 |
155 | ```js
156 | var obj = Object({ name: 'JS BOOk' });
157 | console.log(obj)
158 | >>> {name: JS BOOk}
159 |
160 | var obj2 = Object();
161 | console.log(obj2)
162 | >>> {}
163 | ```
164 |
165 | ## 함수와 메소드
166 |
167 | 함수
168 |
169 | - 빌트인 오브젝트에서 바로 호출
170 | - 오브젝트에 연결
171 | - Object.create()
172 |
173 | 메소드
174 |
175 | - 프로토타입이 존재하는 인스턴스에서 호출하는 함수는 메소드라고 부른다.
176 | - 오브젝트의 prototype에 연결
177 | - Object.prototype.toString()
178 |
179 | ### 함수, 메소드 호출
180 |
181 | 함수 호출 방법
182 |
183 | - Object.create();
184 |
185 |
186 |
187 | 메소드 호출 방법
188 |
189 | - Object.prototype.toString();
190 | - 또는 인스턴스를 생성하여 호출
191 |
192 | ```js
193 | var obj = {};
194 | obj.create();
195 | ```
196 |
197 |
198 |
199 | 함수와 메소드를 구분해야 하는 이유
200 |
201 | - JS 코드 작성 방법이 다르기 때문
202 | - 함수는 파라미터에 값을 작성하고
203 | - 메소드는 메소드 앞에 값을 작성
204 |
205 | 다음 섹션으로
206 |
--------------------------------------------------------------------------------
/BASIC/SECTION10/readme.md:
--------------------------------------------------------------------------------
1 | ## 🌟 Function 오브젝트
2 |
3 | ### 프로퍼티 리스트
4 |
5 | | 이름 | 개요 |
6 | | :----------------: | :----------------------------------: |
7 | | Function |
8 | | Function() | 인스턴스 생성 |
9 | | new Function() | 인스턴스 생성 |
10 | | Function 프로퍼티 | |
11 | | length | 함수의 파라미터 수 |
12 | | Function.prototype |
13 | | constructor | 생성자 |
14 | | call() | 함수 호출 |
15 | | apply() | 함수 호출, 배열을 파라미터로 사용 |
16 | | toString() | 함수를 문자열로 반환 |
17 | | bind() | 새로운 오브젝트를 생성하고 함수 실행 |
18 |
19 | ### new Function()
20 |
21 | ### Function()
22 |
23 |
24 |
25 | ## 🌟 함수 생명 주기
26 |
27 | ### 함수 분류
28 |
29 | function 분류
30 |
31 | - 빌트인 Function 오브젝트
32 | - function 오브젝트
33 | - function 인스턴스 (new 연산자 사용)
34 |
35 | function 오브젝트 생성 방법
36 |
37 | - function 키워드 사용
38 | - function getBook(title){return title};
39 |
40 | JS 엔진이 function 키워드를 만나면
41 |
42 | - 이름이 getBook인 function 오브젝트 생성
43 |
44 | ### 함수 생명 주기 (function life cycle)
45 |
46 | 함수 호출
47 |
48 | - getBook("JS BOOK");
49 | - 함수를 호출하면서 파라미터 값을 넘겨 줌
50 |
51 | 함수 코드 실행
52 |
53 | - JS 엔진 컨트롤이 함수의 처음으로 이동
54 | - 파라미터 이름에 넘겨 받은 파라미터 값 매핑
55 | - 함수 코드 실행
56 | - return 작서엥 관계없이 반환 값을 갖고 함수를 호출한 곳으로 돌아 감
57 |
58 | ```js
59 | function add(one, two) {
60 | return one + two;
61 | }
62 |
63 | var result = add(10, 20);
64 | console.log(result);
65 |
66 | >>> 30
67 | ```
68 |
69 |
70 |
71 | ## 🌟 함수 형태
72 |
73 | 함수 선언문 (Function Declaration)
74 |
75 | ```js
76 | function getBook(book){...}
77 | ```
78 |
79 | - function 키워드, 함수 이름, 블록{ ... }은 작성 필수
80 | - 나머지 파라미터, 함수 코드는 선택
81 | - 함수 이름은 생성한 function 오브젝트의 이름으로 사용
82 |
83 | 함수 표현식(Function Expression)
84 |
85 | ```js
86 | const getBook = function(book){...}
87 | ```
88 |
89 | ```js
90 | var getBook = function (title) {
91 | return title;
92 | };
93 | ```
94 |
95 |
96 |
97 | - function 오브젝트를 생성하여 변수에 할당
98 | - 변수 이름이 function 오브젝트 이름이 됨
99 |
100 |
101 | 식별자 위치의 함수 이름은 생략 가능
102 |
103 | ```js
104 | var name = function abc(){
105 | ...
106 | }
107 |
108 | // 위 코드에서 abc가 식별자 위치의 함수 이름입니다.
109 | ```
110 |
111 | 함수 표현식과 함수 선언식 차이점 알아보기
112 |
113 |
114 |
115 | ## 🌟 함수 호출
116 |
117 | ### call()
118 |
119 | ```js
120 | function getTotal(one, two) {
121 | return one + two;
122 | }
123 |
124 | var result = getTotal.call(this, 10, 20);
125 |
126 | console.log(result);
127 | >>> 30
128 | ```
129 |
130 |
131 |
132 | 첫 번째 파라미터인 (this)로 참조할 오브젝트를 표시
133 |
134 | - 일반적으로 this를 사용하며 다른 오브젝트로도 작성 가능
135 |
136 | ```js
137 | var value = { one: 10, two: 20 };
138 |
139 | function getTotal() {
140 | return this.one + this.two;
141 | }
142 |
143 | var result = getTotal.call(value);
144 |
145 | console.log(result);
146 |
147 | >>> 30
148 | ```
149 |
150 |
151 |
152 | ### apply()
153 |
154 | ```js
155 | function getTotal(one, two) {
156 | return one + two;
157 | }
158 |
159 | var result = getTotal.apply(this, [10, 20]);
160 |
161 | console.log(result);
162 |
163 | >>> 30
164 | ```
165 |
166 |
167 | 파라미터 수가 유동적일 때 사용
168 | 두 번째 파라미터에 배열 사용
169 |
170 | #### call(), apply() 부가적인 목적?
171 |
172 | 첫 번째 파라미터에 호출된 함수에서 this로 참조할 오브젝트 사용
173 |
174 | ### toString()
175 |
176 | ### bind()
177 |
178 | ```js
179 |
180 | const module = {
181 | x: 42,
182 | getX: function () {
183 | return this.x;
184 | },
185 | };
186 |
187 | const unboundGetX = module.getX;
188 | console.log(unboundGetX());
189 | // The function gets invoked at the global scope
190 | // expected output: undefined
191 |
192 | const boundGetX = unboundGetX.bind(module);
193 | console.log(boundGetX());
194 | // expected output: 42
195 |
196 | >>>
197 | undefined
198 | 42
199 |
200 |
201 | ```
202 |
203 |
204 | bind() 함수는 새로운 바인딩한 함수를 만듭니다. 바인딩한 함수는 원본 함수 객체를 감싸는 함수로, ECMAScript 2015에서 말하는 특이 함수 객체입니다. 바인딩한 함수를 호출하면 일반적으로 래핑된 함수가 호출 됩니다.
205 |
206 |
207 | ```js
208 | this.x = 9;
209 | var module = {
210 | x: 81,
211 | getX: function () {
212 | return this.x;
213 | },
214 | };
215 |
216 | module.getX(); // 81
217 |
218 | var retrieveX = module.getX;
219 | retrieveX();
220 | // 9 반환 - 함수가 전역 스코프에서 호출됐음
221 |
222 | // module과 바인딩된 'this'가 있는 새로운 함수 생성
223 | // 신입 프로그래머는 전역 변수 x와
224 | // module의 속성 x를 혼동할 수 있음
225 | var boundGetX = retrieveX.bind(module);
226 | boundGetX(); // 81
227 | ```
228 |
229 |
230 |
231 | ## Argument 오브젝트
232 |
233 | 함수가 호출되어 함수 안으로 이동했을 때 arguments 이름으로 생성되는 오브젝트
234 | 함수를 호출한 곳에서 넘겨 준 값을 순서대로 작성
235 | 호출된 함수에 파라미터를 작성한 경우 호출된 함수의 파라미터에 값을 설정하고 아규먼트 오브젝트에도 저장
236 |
237 | ```js
238 | function getTotal(one) {
239 | return one + arguments[1] + arguments[2];
240 | }
241 |
242 | var result = getTotal(10, 20, 30);
243 |
244 | console.log(result);
245 | >>> 60
246 |
247 | why?
248 | /*
249 | 파라미터를 1개만 받는 함수여도, arguments 배열의 인덱스를 통해, 함수가 받는 파라미가 아닌
250 | 다른 파라미터도 저장 및 반환할 수 있습니다.
251 | */
252 | ```
253 |
254 | ```js
255 | case : 심화;
256 |
257 | function getTotal(one){
258 | return one + arguments[1] + arguments[2];
259 | }
260 |
261 | var result = getTotal.apply(this, [10,20,30]);
262 | console.log(result);
263 | >>> 60
264 | ```
265 |
266 |
267 |
268 | 다음 섹션으로
269 |
270 | ```
271 |
272 | ```
273 |
--------------------------------------------------------------------------------
/BASIC/SECTION11/endecode.js:
--------------------------------------------------------------------------------
1 | const result = encodeURI('안녕하세요');
2 | console.log(result);
3 |
4 | const DecodeResult = decodeURI(result);
5 | console.log(DecodeResult);
6 |
--------------------------------------------------------------------------------
/BASIC/SECTION11/readme.md:
--------------------------------------------------------------------------------
1 | ## 🌟 Global 오브젝트
2 |
3 | ### Global 오브젝트 개요
4 |
5 | 모든 '<'script'>'를 통해 하나만 존재
6 |
7 | - new 연산자로 인스턴스 생성 불가
8 | - (하나만 존재하기 때문에 생성할 필요가 없음)
9 | - 모든 코드에서 공유
10 | - (파일이 달라도 프로퍼티의 값을 공유할 수 있다.)
11 |
12 | 이름은 있지만 오브젝트 실체가 없음
13 | 오브젝트를 작성(사용)할 수 없음
14 |
15 | ```js
16 | console.log(Global.xxx) >>> x;
17 |
18 | why? 실체가 없으므로 그냥 함수만 불러와 사용하면 된다.
19 | ```
20 |
21 | ### Global 오브젝트 함수, 변수
22 |
23 | Global 오브젝트와 함수, 변수를 Global 함수, Global 변수라고 부름
24 | 함수 안에 작성한 것
25 |
26 | - 지역함수, 로컬함수라고 부름
27 | - 지역 변수, 로컬 변수라고 부름
28 |
29 |
30 |
31 | ## Global 프로퍼티
32 |
33 | 프로퍼티 리스트
34 |
35 | | 이름 | 개요 |
36 | | :----------: | :------------------------------------------------: |
37 | | 값 |
38 | | NaN | Not-a-Number |
39 | | Infinity | 무한대 값 |
40 | | undefined | undefined(값이 선언되지 않음) |
41 | | 함수 |
42 | | isNaN() | NaN 여부 NaN이면 true, 아니면 false 반환 |
43 | | isInfinite() | Infinite 여부 Infinite이면 true, 아니면 false 반환 |
44 | | parseInt() | 정수로 변환하여 반환 |
45 | | parseFloat() | 실수로 변환하여 반환 |
46 | | encodeURI() | URI 인코딩 |
47 | | decodeURI() | encodeURI 함수의 인코딩 값을 디코딩 |
48 |
49 |
50 |
51 | 글로벌 오브젝트는 인스턴스를 만들지 못하므로 모두 함수입니다.
52 |
53 |
54 |
55 | ## Global과 window 객체의 관계
56 |
57 | 글로벌과 window 오브젝트 주체
58 |
59 | - 글로벌 오브젝트는 JS가 주체
60 | - window 오브젝트는 window가 주체
61 |
62 | 주체는 다르지만, Global 오브젝트의 프로퍼티와 함수가 window 오브젝트에 설정됨
63 |
64 | - 글로벌 오브젝트는 실체가 없어 어딘가에 저장되어야 하는데, window 객체가 대신 저장해준다.
65 |
66 |
67 |
68 | ## 정수, 실수 변환
69 |
70 | ### parseInt()
71 |
72 | 값을 정수로 변환하여 반환
73 |
74 | ```js
75 | console.log(parseInt(123.56)); >>> 123
76 | console.log(parseInt(24px)); >>> 24
77 | console.log(parseInt("0012")); >>> 12
78 | console.log(parseInt()); >>> NaN
79 | ```
80 |
81 | ### parseFloat()
82 |
83 | 값을 실수로 변환하여 반환
84 |
85 | - JS는 기본적으로 실수로 처리하므로 실수로 변환하는 것이 의미가 없지만 문자열의 실수 변환은 의미가 있다.
86 |
87 | ```js
88 | console.log(parseFloat('-123.456') + 7) >>> 117.456;
89 | ```
90 |
91 |
92 |
93 | ## 인코딩, 디코딩
94 |
95 | ### encodeURI()
96 |
97 | URI를 인코딩하여 반환
98 |
99 | - Uniform Resource Identifier
100 | - 인코딩 제외 문자를 제외하고 "%16진수%16진수" 형태로 변환
101 |
102 | 인코딩 제외 문자
103 |
104 | - 영문자, 숫자
105 |
106 | ```
107 | # ; / ? : @ ^ = + , - _ . ! ~ * ()
108 | ```
109 |
110 | - 프론트에서 사용자의 요청이 한글(문자 또는 문자열)일 경우, 한글을 파라미터로 넘겨줄 때 인코딩 시킨 다음 백엔드에서 디코딩해서 사용
111 |
112 | ### decodeURI()
113 |
114 | 인코딩을 디코딩하여 반환
115 | 파라미터에 encodeURI()로 인코딩한 문자열 작성
116 |
117 | ```js
118 | const result = encodeURI("안녕하세요");
119 |
120 | >>> %EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94
121 | ...
122 |
123 | const DecodeResult = decodeURI(result);
124 | >>> 안녕하세요
125 | ```
126 |
127 |
128 |
129 | 다음 섹션으로
130 |
--------------------------------------------------------------------------------
/BASIC/SECTION12/readme.md:
--------------------------------------------------------------------------------
1 | ## 🌟 Array 오브젝트 (ES3)
2 |
3 | ### Array 오브젝트 개요
4 |
5 | 빌트인 오브젝트
6 | Array(배열)형태
7 |
8 | - [123, "ABC", "가나다"]
9 | - 대괄호 안에 콤마로 구분하여 값 작성
10 |
11 | 배열 엘리먼트
12 |
13 | - [123, "ABC"]에서 123, "ABC"
14 | - 각각을 엘리먼트 또는 요소라고 부름
15 |
16 | ### 배열의 생성 방법
17 |
18 | ```js
19 | case 1: new Array()로 작성
20 | var book = new Array();
21 | ```
22 |
23 | ```js
24 | case 2: Array()로 작성
25 | var book = Array();
26 | ```
27 |
28 | ```js
29 | case 3: 대괄호로 작성
30 | var book = [];
31 |
32 | // 제일 일반적인 형태
33 | ```
34 |
35 | 어떤 생성 방법을 사용하던, 모든 변수는 배열의 프로토타입을 사용할 수 있음
36 |
37 | ### 엘리먼트 작성 방법
38 |
39 | ```js
40 | var book = ['책1', '책2'];
41 | ```
42 |
43 | 대괄호 안에 콤마로 구분하여 다수 작성 가능
44 | String 타입은 큰따옴표, 작은따옴표 모두 가능
45 | JS의 모든 타입의 값, 오브젝트 사용 가능
46 | 값을 작성하지 않고 콤마만 작성하면 undefined가 설정됨
47 |
48 | ### 배열의 차원
49 |
50 | 대괄호 수에 따라 결정
51 |
52 | - 1차원 배열
53 |
54 | ```js
55 | var list = [12, 34, 56];
56 | for (var k = 0; (k < list.length); k++) {
57 | console.log(list[k]);
58 |
59 | >>>
60 | 12
61 | 34
62 | 56
63 | }
64 | ```
65 |
66 | - 2차원 배열
67 |
68 | ```js
69 | var list = [[12, 34, 56]];
70 | for (var k = 0; k < list.length; k++) {
71 | var one = list[k];
72 | for (var m = 0; m < one.length; m++) {
73 | console.log(one[m]);
74 | }
75 | }
76 |
77 |
78 | >>>
79 | 12
80 | 34
81 | 56
82 | }
83 | ```
84 |
85 | - 3차원 배열
86 |
87 |
88 |
89 | ## Array 오브젝트 프로퍼티 (ES3)
90 |
91 | | 이름 | 개요 |
92 | | :--------------: | :--------------------------------------------------------------: |
93 | | new Array() | 인스턴스 생성 |
94 | | Array() | 인스턴스 생성 |
95 | | Array 프로퍼티 |
96 | | length | 배열의 엘리먼트 수 반환 |
97 | | Array.prototype | (인스턴스를 만들었을 때, 생성되는 함수 및 프로퍼티) |
98 | | constructor | 생성자 |
99 | | unshift() | 배열 처음에 엘리먼트 삽입 |
100 | | push() | 배열 끝에 엘리먼트 첨부 |
101 | | concat() | 배열 끝에 값을 연결 |
102 | | slice() | 안덱스 범위의 엘리먼트를 복사 |
103 | | join() | 엘리먼트와 분리자를 결합하여 반환 |
104 | | toString() | 엘리먼트를 문자열로 연결하여 반환 |
105 | | toLocaleString() | 엘리먼트를 지역화 문자로 변환하고 문자열로 연결하여 반환 |
106 | | shift() | 첫 번째 엘리먼트를 삭제하고 삭제한 엘리먼트 반환 |
107 | | pop() | 마지막 엘리먼트를 삭제하고 삭제한 엘리먼트 반환 |
108 | | splice() | 엘리먼트를 삭제하고 새로운 엘리먼트를 삽입, 삭제한 엘리먼트 반환 |
109 | | sort() | 엘리먼트 값을 Unidode 순서로 분류하여 반환 |
110 | | reverse() | 엘리먼트 위치를 역순으로 바꾸어 반환 |
111 |
112 |
113 |
114 | ## Array 인스턴스 생성
115 |
116 | ### Array(), new Array()
117 |
118 | Array 인스턴스 생성, 반환
119 | 배열 생성 기준
120 |
121 | - 파라미터에 따라 배열 생성 기준이 다르다
122 | - 파라미터를 작성하지 않으면 빈 배열로 생성
123 | - 작성한 순서로 엘리먼트에 설정
124 | - new Array(3)처럼 파라미터에 숫자를 작성하면 3개의 엘리먼트 생성
125 | > 값이 할당되어있지 않기 때문에 undefined 출력
126 |
127 | ```js
128 | var list = new Array(3);
129 | console.log(list);
130 |
131 | >>>
132 | [undefined, undefined, undefined]
133 | ```
134 |
135 | - new Array()는 new 연산자에서 생성자 함수를 호출하여 인스턴스 생성
136 | - Array()는 직접 생성자 함수를 호출하여 인스턴스 생성
137 |
138 |
139 |
140 | ## 엘리먼트 추가, 삭제 메커니즘
141 |
142 | ### 엘리먼트 추가
143 |
144 | 배열에 엘리먼트를 추가하는 방법
145 |
146 | - 삽입할 위치에 인덱스 지정
147 |
148 | ```js
149 | var value = [1, 2];
150 | value[4] = 5;
151 | console.log(value);
152 |
153 | >>>
154 | [1,2, undefined, undefined, 5]
155 | ```
156 |
157 | - 표현식으로 인덱스 지정
158 |
159 | ```js
160 | var value = [1.2];
161 | value[value.length + 2] = 5;
162 | console.log(value);
163 |
164 | >>>
165 | [1,2, undefined, undefined, 5]
166 | ```
167 |
168 | ### 엘리먼트 삭제 메커니즘
169 |
170 | 삭제된 인덱스에 undefined 설정
171 |
172 | - 배열을 읽을 때 제외시켜야 합니다.
173 | - 삭제를 해도 [1,2,3,4] >> [1,3,4] 가 되지 않습니다.
174 | - [1, undefined, 3, 4 ]가 됩니다.
175 |
176 | ### delete 연산자
177 |
178 | | 구분 | 데이터(값) |
179 | | :----: | :---------------------------------: |
180 | | object | 매치 대상 |
181 | | 인덱스 | 배열의 인덱스 |
182 | | 반환 | 삭제 성공 : true, 삭제 실패 : false |
183 |
184 |
185 |
186 | var 변수는 삭제 불가
187 |
188 | ```js
189 | var value = 123;
190 | console.log(delete value);
191 | >>>
192 | false
193 | ```
194 |
195 | 글로벌 변수는 삭제 가능
196 |
197 | ```js
198 | value = "글로벌"
199 | console.log(delete value);
200 | >>>
201 | true
202 | ```
203 |
204 | 프로퍼티 {name: value} 삭제 방법
205 |
206 | - 삭제할 프로퍼티 이름(key) 작성 (코드에서는 title)
207 |
208 | ```js
209 | var book = {title : "책"};
210 | console.log(delete book.title);
211 | >>>
212 | true
213 | ```
214 |
215 | 인덱스로 배열의 엘리먼트 삭제
216 |
217 | ```js
218 | var value = [1,2,3,4];
219 | console.log(delete value[1]);
220 | console.log(value.length);
221 | console.log(value);
222 |
223 | >>>
224 | true
225 | 4
226 | [1, undefined, 3, 4]
227 |
228 | // 엘리먼트는 삭제되지만, 배열의 크기가 줄어들지는 않습니다.
229 | ```
230 |
231 |
232 |
233 | ## 엘리먼트 삽입, 첨부
234 |
235 | ### unshift()
236 |
237 | | 구분 | 데이터(값) |
238 | | :------: | :-------------------: |
239 | | data | 기준 |
240 | | 파라미터 | [item 1, item 2], opt |
241 | | 반환 | 추가 후의 length |
242 |
243 | 0 번 인덱스에 파라미터 값 삽입
244 | 배열에 있던 엘리먼트는 뒤로 이동
245 |
246 | ```js
247 | var value = [1,2];
248 | value.unshift(345,67);
249 | console.log(value);
250 |
251 | >>>
252 | [345, 67, 1, 2]
253 | ```
254 |
255 | ### push()
256 |
257 | | 구분 | 데이터(값) |
258 | | :------: | :-------------------: |
259 | | data | 기준 |
260 | | 파라미터 | [item 1, item 2], opt |
261 | | 반환 | 추가 후의 length |
262 |
263 | 배열 끝에 파라미터 값을 첨부
264 |
265 | ```js
266 | var value = [1, 2];
267 | value.push(345,67);
268 | console.log(value);
269 |
270 | >>>
271 | [1,2,345,67]
272 | ```
273 |
274 | 서버에서 데이터를 받아와 추가해줄 때 사용
275 |
276 | ## concat()
277 |
278 | | 구분 | 데이터(값) |
279 | | :------: | :-------------------: |
280 | | data | 기준 |
281 | | 파라미터 | [item 1, item 2], opt |
282 | | 반환 | 연결 결과 |
283 |
284 | 배열에 파라미터 값을 연결하여 반환
285 |
286 | ```js
287 | var value = [1, 2];
288 | var result = value.concat(3, 4);
289 | console.log(result);
290 | >>>
291 | [1,2,3,4]
292 | ```
293 |
294 |
295 |
296 | ## 엘리먼트 복사
297 |
298 | ### slice()
299 |
300 | | 구분 | 데이터(값) |
301 | | :------: | :-------------------: |
302 | | data | 대상 |
303 | | 파라미터 | [item 1, item 2], opt |
304 | | 반환 | 연결 결과 |
305 |
306 | 배열의 일부를 복사하여 배열로 반환
307 |
308 | - 첫 번째 파라미터의 인덱스부터 두 번째 인덱스 직전까지
309 |
310 | ```Js
311 | var origin = [1,2,3,4,5];
312 | var result = origin.slice(1,3); // 인덱스 1번부터 인덱스 3번 전까지
313 |
314 | >>> [2,3]
315 |
316 | // 원본은 바뀌지 않음
317 |
318 | console.log(origin);
319 |
320 | >>> [1,2,3,4,5]
321 | ```
322 |
323 | - true(1), false(0) 를 수자로 변환
324 |
325 | ```js
326 | var value = [1, 2, 3, 4, 5];
327 | value.slice(true, 3) >>> [2, 3]; // true = 1, value[3] 직전까지
328 |
329 | value.slice(false, 3) >>> [1, 2, 3]; // false = 0, value[3] 직전까지
330 | ```
331 |
332 | - 첫 번째 파라미터만 작성
333 |
334 | ```js
335 | console.log([1,2,3,4].slice(1));
336 |
337 | >>>
338 | [2,3,4]
339 | // index[1] 부터, 파라미터가 1개이므로 끝 인덱스 (opt) default: length 3
340 | ```
341 |
342 |
343 |
344 | ## 엘리먼트 값을 문자열로 변환
345 |
346 | ### join()
347 |
348 | 엘리먼트와 분리자를 하나씩 결합하여 문자열로 연결
349 |
350 | - [0] 인덱스, 분리자, [1]인덱스, 분리자
351 | - 마지막 엘리먼트는 분리자를 연결하지 않음
352 |
353 | ```js
354 | var value = [1, 2, 3];
355 | var result = value.join('##');
356 | console.log(result);
357 |
358 | >>>
359 | 1##2##3
360 |
361 | console.log(typeOf(result));
362 |
363 | >>> string
364 |
365 | // join에 문자열을 넣음에 따라, 배열이 아닌 string 타입으로 바뀌게 됨
366 | ```
367 |
368 | 파라미터를 작성하지 않으면 콤마로 분리
369 | 파라미터에 빈 문자열 작성
370 |
371 | ```js
372 | var value = [1,2,3];
373 | var result = value.joun("");
374 | console.log(result);
375 |
376 | >>>
377 | 123
378 |
379 | console.log(typeOf(result));
380 | >>>
381 | string
382 |
383 | // ""라는 화이트 스페이스를 조인하면서 배열이 아닌 string 타입으로 바뀌게 됨
384 | ```
385 |
386 |
387 |
388 | ## 엘리먼트 삭제
389 |
390 | ### shift()
391 |
392 | 배열의 첫 번째 엘리먼트 삭제
393 | 삭제한 엘리먼트 값이 undefined로 남지 않고 완전히 삭제됨
394 |
395 | - length 값이 하나 줄어 듬
396 |
397 | ```js
398 | var value = [1,2, 34];
399 | console.log(value.shift());
400 |
401 | >>> 1 // shift()된 요소(엘리먼트) 출력
402 |
403 | console.log(value);
404 |
405 | >>> [2, 34];
406 | ```
407 |
408 | 빈 배열이면 undefined가 반환 됨
409 |
410 | ### pop()
411 |
412 | 배열의 마지막 엘리먼트 삭제
413 | 삭제한 엘리먼트 값이 undefined로 남지 않고 완전히 삭제됨
414 |
415 | - length 값이 하나 줄어 듬
416 |
417 | ```js
418 | var value = [1,2,34];
419 |
420 | console.log(value.pop());
421 | >>>> 34
422 |
423 | console.log(value);
424 | >>> [1,2]
425 | ```
426 |
427 | 빈 배열이면 undefined 반환
428 |
429 | ### splice()
430 |
431 | 엘리먼트를 삭제하고 삭제한 엘리먼트 반환
432 | 삭제한 위치에 세 번째 파라미터 삽입
433 |
434 | ```js
435 | var value = [1,2,3,4,5];
436 | console.log(value.splice(1,3)); // 1 > 인덱스, 3 삭제할 엘리먼트 수
437 |
438 | >>> [2,3,4]
439 |
440 | console.log(value); // 남은 value 값 출력
441 | >>> [1,5]
442 |
443 | ```
444 |
445 |
446 |
447 | ### sort(분류)
448 |
449 | 엘리먼트 값을 Unicode 포인트 순으로 정렬
450 |
451 | - 코드 포인트가 작으면 앞에 오고 크면 뒤에 옵니다
452 |
453 | ```js
454 | var value = [4,2,3,1];
455 | console.log(value.sort());
456 | >>> [1,2,3,4];
457 |
458 | console.log(value);
459 | >>> [1,2,3,4]
460 | ```
461 |
462 | sort 대상 배열도 정렬됨 (코드에서는 value)
463 | 값이 undefined 이면 끝으로 이동
464 |
465 |
466 |
467 | 다음 섹션으로
468 |
--------------------------------------------------------------------------------
/BASIC/SECTION12/test.js:
--------------------------------------------------------------------------------
1 | var list = [[12, 34, 56]];
2 | for (var k = 0; k < list.length; k++) {
3 | var one = list[k];
4 | for (var m = 0; m < one.length; m++) {
5 | console.log(one[m]);
6 | }
7 | }
8 |
9 | var value = [56, 2, 34];
10 | var result = value.shift();
11 |
12 | console.log('shift한 엘리먼트 출력: ', result);
13 | console.log(value); // 배열 자체에서 인덱스[0] 번 엘리먼트가 사라짐
14 |
--------------------------------------------------------------------------------
/BASIC/SECTION13/readme.md:
--------------------------------------------------------------------------------
1 | ## 🌟 Array 오브젝트 (ES5)
2 |
3 | ### 프로퍼티 리스트(ES5)
4 |
5 | | 이름 | 개요 |
6 | | :-----------------: | :-------------------------------------------------------------: |
7 | | Array 함수 |
8 | | isArray() | 배열 여부 반환, 배열이면 true 아니면 false 반환 |
9 | | Array.prototype |
10 | | indexOf() | 지정한 값에 일치하는 엘리먼트 인덱스 반환 |
11 | | lastIndexOf() | indexOf()와 같으며, 마지막 인덱스 반환 |
12 | | forEach() ✔️ ℹ️ | 배열을 반복하면서 콜백 함수 실행 |
13 | | every() ✔️ ℹ️ | 반환 값이 false일 때까지 콜백 함수 실행 |
14 | | some() ✔️ ℹ️ | 반환 값이 true일 때까지 콜백 함수 실행 |
15 | | filter() ✔️ ℹ️ | 콜백 함수에서 true를 반환한 엘리먼트 반환 (false인 값은 없어짐) |
16 | | map() ✔️ ℹ️ | 콜백 함수에서 반환한 값을 새로운 배열로 반환 |
17 | | reduce() ✔️ ! | 콜백 함수의 반환 값을 파라미터 값으로 사용 (왼 > 오) |
18 | | reduceRight() ✔️ ! | reduce()와 같음 단, 배열의 끝에서 앞으로 진행 (오 > 왼) |
19 |
20 |
21 | - ✔️ 배열을 반복할 때마다 콜백 함수를 실행
22 | - ℹ️ 파라미터를 3개를 넘겨줌
23 | - ! 파라미터가 4개
24 |
25 | ### isArray()
26 |
27 | 체크 대상이 배열이면 true, 아니면 false
28 | isArray()는 함수이다. (isArray 와 같은 프로퍼티가 아님)
29 |
30 | ```js
31 | console.log(Array.isArray([1, 2])); >>> true;
32 | console.log(Array.isArray(123)); >>> false;
33 |
34 | //isArray()가 함수인 이유
35 |
36 | console.log(typeOf[1,2]) >>> object
37 |
38 | // 타입오브 연산자로 배열임을 확인할 수 없기 때문에 배열임을 확인하기 위해 isArray() 함수가 추가됨
39 | ```
40 |
41 |
42 |
43 | ## index 처리 메소드
44 |
45 | ### indexOf()
46 |
47 | 파라미터 값과 같은 엘리먼트의 인덱스를 반환
48 |
49 | - 왼쪽에서 오른쪽으로 검색
50 | - 값이 같은 엘리먼트가 있으면 검색 종료
51 | - 데이터 타입까지 체크 (===)
52 |
53 | ```js
54 | var value = [1, 2, 3, 4, 5];
55 | console.log(value.indexOf(2)); >>> 1;
56 |
57 | // why? value 값이 2인 인덱스 value[1] 을 반환해줬다.
58 | ```
59 |
60 | ```js
61 | var value = [1, 2, 3, 4, 5];
62 | console.log(value.indexOf('-2')); >>> -1
63 |
64 | // why? value에 -2라는 값이 없고, 타입까지 비교하기 때문에 string 타입이 없어 -1을 반환함
65 | ```
66 |
67 | 파라미터가 두 개일 경우, 두 번째 파라미터의 인덱스부터 검색
68 |
69 |
70 |
71 | ## 콜백 함수를 가진 Array 메소드
72 |
73 | ### 지금부터 다루는 7개의 메소드는 모두 콜백 함수를 호출합니다. 키워드는 시멘틱과 독립성입니다.
74 |
75 | ### forEach()
76 |
77 | 배열의 엘리먼트를 하나씩 읽어 가면서 콜백 함수 호출
78 | 콜백 함수 파라미터 (엘리먼트(요소) 값, 인덱스, 배열 전체)
79 |
80 | ```js
81 | code 1: 콜백 함수의 파라미터 element, index, all
82 | var list = ["A", "B", "C"];
83 | list.forEach(function(el, index, all){
84 | console.log(el + ":" + index + ":" + all);
85 | });
86 |
87 | >>>
88 | A:0:A,B,C
89 | B:0:A,B,C
90 | C:0:A,B,C
91 | ```
92 |
93 | break, continue 사용 불가 (무조건 배열 전체를 돌아야 함)
94 | 콜백 함수 분리
95 |
96 | ```js
97 | code 2: 콜백 함수 분리
98 | var list = ["A", "B", "C"];
99 | var func1 = function(el, index, all){
100 | console.log(el + ":" + index + ":" + all);
101 | };
102 | list.forEach(func1);
103 |
104 | >>>
105 | A:0:A,B,C
106 | B:0:A,B,C
107 | C:0:A,B,C
108 |
109 | /*
110 | 콜백함수 func1을 따로 분리하여 forEach()문을 사용
111 | 이렇게 forEach()문처럼 콜백 함수와 관계없이 바로 뜻을 확인할 수 있는 것을 시멘틱이라 합니다.
112 | */
113 |
114 | ```
115 |
116 | this로 오브젝트 참조가능
117 |
118 | ```js
119 | code 3: this 오브젝트 참조
120 |
121 | var list = [1,2];
122 | var fn = function(el, index, all){
123 | console.log(el + this.ten);
124 | };
125 | list.forEach(fn, {ten : 10});
126 |
127 | >>>
128 | 11
129 | 12
130 |
131 | // this 를 통해 {ten : 10} 프로퍼티를 forEach()문의 파라미터로 넣어주었다.
132 | ```
133 |
134 |
135 |
136 | ## for() 문과 forEach()의 차이
137 |
138 | ### forEach()
139 |
140 | forEach()를 시작할 때 반복 범위 결정
141 | 엘리먼트를 추가하더라도 처리하지 않음
142 |
143 | ```js
144 | var list = [1, 2, 3];
145 | var fn = function (el, index, all) {
146 | if (index === 0) {
147 | list.push('AB');
148 | }
149 | console.log(el);
150 | };
151 | list.forEach(fn);
152 |
153 | >>>
154 | 1
155 | 2
156 | 3
157 |
158 | /*
159 | 1 2 3 AB 라고 생각할 수 있지만, 시작할 때 이미 인덱스가 3개로 범위가 정해졌기 때문에 추가하더라도 반영되지 않습니다.
160 | forEach()문의 특징입니다.
161 | */
162 | ```
163 |
164 | 현재 인덱스보다 큰 인덱스의 값을 변경하면 변경된 값을 사용
165 |
166 | ```js
167 | var list = [1, 2, 3];
168 | var fn = function (el, index, all) {
169 | if (index === 0) {
170 | list[2] = 345;
171 | }
172 | console.log(el);
173 | };
174 | list.forEach(fn);
175 |
176 | >>>
177 | 1
178 | 2
179 | 345
180 |
181 | /*
182 | code 1과 달리 index 내의 변화는 변경이 가능하다.
183 | list[2] 현재 존재하는 인덱스와 값이 있기 때문에, 이를 변경하였고
184 | 결과적으로 element가 변화됐음을 알 수 있다.
185 | */
186 | ```
187 |
188 | 현재 인덱스보다 큰 인덱스의 엘리먼트를 삭제하면 배열에서 삭제되므로, 반복에서 제외됨
189 |
190 | - 추가는 처리하지 않지만, 삭제는 반영된다.
191 |
192 | ### for() 와 forEach()
193 |
194 | forEach()는 시멘틱 접근이다. (코드를 읽어보지 않더라도 어떤 의미인지 알아야 함)
195 |
196 | - 처음부터 끝까지 반복한다는 시맨틱
197 | - 반복 중간에 끝나지 않는다는 시멘틱
198 |
199 | for()는 함수 코드를 읽어야 알 수 있다
200 |
201 | - break, continue가 있기 때문에 무조건 반복하는 것이 아니다
202 | - 조건에 따라 나올 수 있기 때문에
203 |
204 | forEach()는 반복만 하며 콜백 함수에서 기능을 처리한다.
205 |
206 | forEach()는 인덱스 0부터 시작
207 |
208 | - for()와 같이 인덱스 증가 값을 조정할 수 없음
209 |
210 | ```js
211 | for(var k = 2; ... ; k++){
212 | 과 같이 초기 시작 인덱스를 정해줄 수 없다는 의미
213 | }
214 | ```
215 |
216 |
217 |
218 | ## true, false를 반환하는 메소드
219 |
220 | ### every(), some()
221 |
222 | 서로 정 반대되는 의미를 가지기 때문에 한 번에 처리함
223 | forEach()처럼 시멘틱 접근
224 |
225 | - false를 반환할 때까지 콜백 함수 호출
226 | - 즉, false가 반환되면 반복 종료
227 | - false를 반환하지 않으면 true 반환
228 |
229 | ```js
230 | var value = [20, 10, 30, 40];
231 | var fn = function (el, index, all) {
232 | console.log(el);
233 | return el > 15; // 10을 만나는 순간 false가 되기 때문에 더이상 진행하지않고 나옴
234 | };
235 | var result = value.every(fn);
236 | console.log('결과', result); // 콘솔창에 '결과'를 찍게됨
237 | >>>
238 |
239 | 20
240 | 10
241 | 결과 : false
242 | ```
243 |
244 | false가 되는 조건이 배열의 앞에 있을 때 효율성이 높다.
245 |
246 |
247 |
248 | ## filter(), map()
249 |
250 | ### filter()
251 |
252 | forEach()처럼 시멘틱 접근이다
253 | 배열의 엘리먼트를 하나씩 읽어가면서 콜백 함수에서 true를 반환하면 현재 읽은 엘리먼트를 반환
254 | 조건에 맞는 엘리먼트를 추려낼 때 유용하다.
255 |
256 | ```js
257 | var value = [10, 20, 30, 40];
258 | var fn = function (el, index, all) {
259 | return el > 15;
260 | };
261 | var result = value.filter(fn);
262 |
263 | console.log(result);
264 |
265 | >>>
266 | [20, 30, 40]
267 |
268 | /*
269 | return 문이 포함된 콜백함수의 조건에 맞게 filter링되었다.
270 | 조건문이 true인 값만 거르고 false를 제거한다.
271 | */
272 | ```
273 |
274 | ### map()
275 |
276 | forEach()처럼 시맨틱 접근
277 | 배열의 엘리먼트를 하나씩 읽어가면서 콜백 함수에서 반환한 값을 새로운 배열에 첨부하여 반환
278 |
279 | ```js
280 | var value = [10, 20, 30];
281 | var fn = function (el, index, all) {
282 | return el + this.num1;
283 | };
284 | var point = { num1: 100 };
285 | var result = value.map(fn, point);
286 |
287 | >>>
288 |
289 | 110
290 | 120
291 | 130
292 | ```
293 |
294 |
295 |
296 | 다음 섹션으로
297 |
--------------------------------------------------------------------------------
/BASIC/SECTION14/readme.md:
--------------------------------------------------------------------------------
1 | ## 🌟 자바스크립트 특징
2 |
3 | ### 자바스크립트 특징
4 |
5 | 자바스크립트는 스크립팅 언어입니다
6 | 스크립팅 언어의 특징
7 |
8 | - 소스 파일의 코드를 사전에 컴파일하여 실행 파일을 만들어 놓지 않고
9 | - 사용하는 시점에 컴파일하고 실행
10 |
11 | ```js
12 | var value = 123;
13 | var book = function () {
14 | // function 키워드를 만나면 오브젝트를 생성
15 | // 안의 코드는 컴파일하지 않음
16 | var point = 456;
17 | var getPoint = function () {
18 | return point;
19 | };
20 | getPoint();
21 | };
22 | book(); // book() 메소드를 호출할 때 해당 function을 컴파일하기 시작함
23 | ```
24 |
25 |
26 | 컴파일 순서
27 | - 소스 파일의 위에서부터 아래로 컴파일
28 | - function 키워드를 만나면 function 오브젝트를 생성
29 |
30 | ### JS와 객체지향
31 |
32 | 객체 지향 프로그래밍 언어
33 |
34 | - OOP: Object Oriented Programming
35 |
36 | 자바스크립트는 객체 지향 언어입니다
37 |
38 | 자바스크립트의 OOP 구현
39 |
40 | - 다른 언어의 OOP 구현과 차이가 있음
41 | - JS의 특징이 반영된 OOP 구현
42 |
43 | ### OOP의 객체
44 |
45 | 객체(Object)
46 |
47 | - 개념적 접근 (실체 x)
48 | - 행위와 속성으로 구성
49 | - 행위 : 먹다, 마시다
50 | - 속성: 밥, 사이다
51 |
52 | > 객체를 형성화하면
53 |
54 | - 행위가 메소드가 되고
55 | - 속성이 프로퍼티가 됩니다.
56 | - 객체가 클래스로 됩니다.
57 |
58 |
59 |
60 | > 클래스 Class
61 |
62 | - 행위와 속성을 정의한 것으로
63 | - 인스턴스로 생성하여 프로그램에서 사용
64 | - 클래스는 new 연산자(생성자)를 사용하여 인스턴스를 생성해야함
65 |
66 |
67 |
68 | ## 자바스크립 객체 형태
69 |
70 | ### JS 객체 형태
71 |
72 | 1. Object 오브젝트 형태
73 |
74 | ```js
75 | var book = { read: function(params){ ... }}
76 | ```
77 |
78 | - 인스턴스를 생성할 수 없음
79 |
80 | 2. Function 오브젝트 형태
81 |
82 | ```js
83 | function readBook(params){...};
84 | ```
85 |
86 | - 객체이지만, OOP의 객체라고 하기에는 부족
87 |
88 | ### prototype
89 |
90 | JS의 OOP 구현 방법
91 |
92 | - prototype에 메소드 연결
93 |
94 | ```js
95 | var Book = function () {};
96 | // 대문자인 것은 프로토 타입에 연결하여 쓰겠다는 시멘틱적 표현입니다.
97 |
98 | Book.prototype.getBook = function () {
99 | return 'JS북';
100 | };
101 | ```
102 |
103 | - 다른 언어는 class 안에 메소드와 프로퍼티를 작성하지만
104 | - 자바스크립트는 prototype에 메소드를 연결하여 작성합니다.
105 | - ES6에서는 class에 메소드를 작성합니다.
106 | - 하지만, JS 엔진 내부에서 prototype에 연결합니다.
107 |
108 | ```js
109 | class Book {
110 | constructor(title) {
111 | this.title = title;
112 | }
113 | getBook() {
114 | return this.title;
115 | }
116 | }
117 | ```
118 |
119 |
120 |
121 | ## 자바스크립트 인스턴스
122 |
123 | ### 인스턴스
124 |
125 | - class를 new 연산자로 생성한 것
126 | - ES5에는 클래스가 없지만, 프로토타입으로 연결된 것이 있다면 class로 봅니다.
127 |
128 | ### 인스턴스 목적
129 |
130 | - Class에 작성된 메소드 사용
131 | - 인스턴스마다 프로퍼티 값을 유지
132 | - 축구 경기에서 각 팀에 적용되는 규칙(= 메소드)은 같지만, 팀마다 점수(= 프로퍼티의 값)는 다릅니다.
133 |
134 | ### new 연산자
135 |
136 | 인스턴스를 생성하여 반환
137 |
138 | ```js
139 | var Book = function (point) { // 2. 전달 받은 파라미터를 point 에 넣어줌 this.point = 200;
140 | this.point = point;
141 | };
142 |
143 | Book.prototype.getPoint = function () {
144 | return this.point + 100; // 3. getPoint함수를 실행할 때, 전달받은 파라미터를 넘겨주고 반환
145 | };
146 |
147 | var oneInstance = new Book(200); // 1. new 생성자를 이용해 인스턴스 생성 및 파라미터 전달(200)
148 |
149 | console.log(oneInstace.getPoint()); // 4. 결과값 출력
150 |
151 | >>>
152 | 300
153 | ```
154 |
155 |
156 |
157 | ## 메소드 형태
158 |
159 | 1. 데이터 형태
160 |
161 | - 배열: ["book", "책", 123];
162 |
163 | 2. OOP의 일반적인 형태
164 |
165 | ```js
166 | var data = ['book', '책', 123];
167 | var obj = new Array(); // obj의 엘리먼트는 아직 선언하지 않았기 때문에 빈 배열 상태
168 | var result = obj.concat(data);
169 | console.log(result);
170 |
171 | >>>
172 | [book, 책, 123]
173 | ```
174 |
175 | 3. 자바스크립트 형태
176 | > 데이터로 메소드 호출
177 |
178 | ```js
179 | var data = ['book', '책', 123];
180 | var result = data.concat();
181 | console.log(result);
182 |
183 | >>>
184 | [book, 책, 123]
185 |
186 | /*
187 | JS 엔진이 data 타입에 따라 오브젝트를 결정
188 | data가 배열이므로 Array의 프로토타입인 concat() 호출, data를 파라미터로 넘겨줌
189 | 일반적인 OOP로는 말이 안됨 why? Array() 오브젝트를 통해 인스턴스를 만들어주지 않았기 때문
190 | but JS 엔진에 의해 가능 (JS OOP의 특징)
191 | */
192 | ```
193 |
194 | > 오브젝트 함수 호출
195 |
196 | ```js
197 | var data = ['book', '책', 123];
198 | var bookObj = {
199 | concat: function (data) {
200 | return data.concat();
201 | },
202 | };
203 |
204 | console.log(bookObj.concat(data));
205 | >>>
206 | [book, 책, 123]
207 | ```
208 |
209 | > 인스턴스의 메소드 호출
210 |
211 | ```js
212 | var data = ['book', '책', 123];
213 | var Book = function (data) {
214 | this.data = data;
215 | };
216 | Book.prototype.concat = function () {
217 | return this.data.concat();
218 | };
219 | var oneInstance = new Book(data);
220 | console.log(oneInstance.concat());
221 | ```
222 |
223 |
224 |
225 | 다음 섹션으로
226 |
--------------------------------------------------------------------------------
/BASIC/SECTION15/parse.js:
--------------------------------------------------------------------------------
1 | var value = '123';
2 | try {
3 | var result = JSON.parse(value);
4 | } catch (e) {
5 | console.log('JSON 파싱 에러');
6 | }
7 | console.log(result);
8 | console.log(typeof result);
9 |
10 | var value2 = true;
11 | var result2 = JSON.parse(value2);
12 | console.log(result2);
13 | console.log(typeof result2);
14 |
15 | var value3 = { point: '123' };
16 | var result3 = JSON.parse(value3);
17 | console.log(result3);
18 |
--------------------------------------------------------------------------------
/BASIC/SECTION15/readme.md:
--------------------------------------------------------------------------------
1 | ## 🌟 JSON 오브젝트
2 |
3 | ### JSON 오브젝트 개요
4 |
5 | JavaScript Object Notation
6 |
7 | - 빌트인 오브젝트
8 | - new 연산자로 인스턴스 생성 불가
9 |
10 |
11 | JSON 주요 기능
12 |
13 | - 데이터 송수신의 변환 기준
14 | > XML 에서 JSON 으로 차차 변화
15 | - 텍스트이므로 전송 속도가 빠르다
16 | > XML은 파일이기 때문에 상대적으로 무거웠음
17 | - 파일 확장자: .json, .txt 도 사용 가능
18 |
19 |
20 |
21 | JS 데아터 타입 지원
22 |
23 | - 다른 언어도 사용하지만, 완전하게 같지 않을 수도 있음
24 |
25 | ### stringify()
26 |
27 | JS 타입을 JSON 타입의 문자열로 변환
28 |
29 | - JSON.stringify() 형태로 호출
30 |
31 | ### 1. 파라미터가 하나일 때
32 |
33 | ```js
34 | code 1: 큰 따옴표 안에 작성됨
35 |
36 | var value = { book: '책', title: 123 };
37 |
38 | var result = JSON.stringify(value);
39 | console.log(result);
40 |
41 | >>>
42 | {"book" : "책", "title" : 123 }
43 | ```
44 |
45 | ```js
46 | code 2: 배열 변환
47 |
48 | var value = { 'book', '책', 123};
49 | var result = JSON.stringify(value);
50 | console.log(result);
51 |
52 | >>>
53 | ["book", "책", 123]
54 | ```
55 |
56 | ```js
57 | code 3 : 특수한 값 변환
58 |
59 | console.log(JSON.stringify([Infinity, NaN, null]));
60 | console.log(JSON.stringify([true, false]));
61 |
62 | >>>
63 | [null, null, null]
64 | [true, false]
65 |
66 | /*
67 | Infinity, NaN, null 은 null로 변환됩니다.
68 | true, false는 변환하지 않습니다.
69 | */
70 | ```
71 |
72 | ```js
73 | code 4: undefined 변환
74 |
75 | console.log(JSON.stringify(undefined));
76 | console.log(JSON.stringify([undefined]));
77 | console.log(JSON.stringify({ value : undefined }));
78 |
79 | >>>
80 | undefined
81 | [null]
82 | {}
83 |
84 | /*
85 | 값이 하나면 그대로 변환
86 | undefined가 배열 안에 있으면 null로 변환
87 | 프로퍼티 값이면 해당 프로퍼티를 제외시킴 >>> {key: value}의 프로퍼티 전체를 제외
88 | */
89 | ```
90 |
91 | ### 2. 파라미터가 두 개일 때
92 |
93 | ```js
94 | code 1 : 두 번째 파라미터에 함수 작성
95 |
96 | var data = { book: '책', point: 65 };
97 | function replace(key, value) {
98 | return key === 'point' ? 11 : value;
99 | }
100 |
101 | var result = JSON.stringify(data, replace);
102 | console.log(result);
103 | >>>
104 | {"book": "책", "point" : 11}
105 | ```
106 |
107 | ```js
108 | code 2: 두 번째 파라미터에 배열 작성
109 |
110 | var data = { book: '책', point: 65, amount : 90 };
111 | var result = JSON.stringify(data, ['book', 'amount']);
112 | console.log(result);
113 |
114 | >>>
115 | {"book" : "책", "amount" : 90}
116 | /*
117 | stringify() 의 두 번쨰 파라미터 배열에 포함된 프로퍼티{key: value}만 출력합니다.
118 | */
119 | ```
120 |
121 | ### 2. 파라미터가 세 개일 때
122 |
123 | ```js
124 | code 1: 세 번째 파라미터에 줄 분리 작성
125 |
126 | var data = {sports: 'soccer', time: 90};
127 | var result = JSON.stringify(data, "", '\n');
128 | console.log(result);
129 |
130 | >>>
131 | {
132 | "sports" : "soccer",
133 | "time" : 90
134 | }
135 | ```
136 |
137 | ```js
138 | code 2: 들여쓰기 숫자 작성
139 |
140 | var data = {sports: 'soccer', time: 90};
141 | var result = JSON.stringify(data, "", 4); // 세 번째 파라미터에 숫자는 들여쓰기 자릿수입니다.
142 | console.log(result);
143 |
144 | >>>
145 | {
146 | "sports" : "soccer",
147 | "time": 90
148 | }
149 |
150 | ```
151 |
152 |
153 |
154 | ## JSON 타입 파싱 ( parse( ) )
155 |
156 | JSON 타입을 JS 타입으로 변환
157 |
158 | ```js
159 | code 1 : JSON 값이 숫자일 때,
160 |
161 | var value= "123";
162 | try {
163 | var result = JSON.parse(value);
164 | } catch(e){
165 | console.log("JSON 파싱 에러");
166 | }
167 | console.log(result);
168 | console.log(typeof result);
169 |
170 | >>>
171 | 123
172 | number
173 | /*
174 | - JS 엔진에 의해 " " 문자열로 작성되었더라도 number 타입으로 파싱해줍니다.
175 | - 이는 JS의 특징입니다.
176 | - 또한 try{} catch{} 문으로 감싸주는 이유는
177 | - 일반적으로 JSON.parse()를 사용하는 경우가 서버나 JSON으로 작성된 API문서를 가져올 떄이기 때문에
178 | - 처음 넘어올 때 오류가 발생하지 않는지 try/catch 문으로 감싸주는 것이 좋습니다.
179 | */
180 | ```
181 |
182 | ```js
183 | code 2 : JSON 타입이 true, false 일 때
184 |
185 | var value = true;
186 | var result = JSON.parse(value);
187 | console.log(result);
188 | console.log(typeof result;)
189 |
190 | >>>
191 | true
192 | boolean
193 | ```
194 |
195 | ```js
196 | code 3: 배열에 작성
197 |
198 | var value = ['ABC', '가나', '12'];
199 | var result = JSON.parse(value);
200 | console.log(result);
201 | >>>
202 | ['ABC', '가나', '12']
203 | // 배열에 작성된 String 타입의 숫자는 숫자로 변환하지 않습니다.
204 | ```
205 |
206 | ```js
207 | code 4: Object 에 작성
208 |
209 | var value = {"point" : "123"};
210 | var result = JSON.parse(value);
211 | console.log(result);
212 |
213 | >>>
214 | {point: "123"}
215 | // 일반적인 형변환과 같이 Object 안에 작성된 String 타입의 숫자는 변환하지 않습니다.
216 | ```
217 |
218 |
219 |
220 | 처음으로
221 |
--------------------------------------------------------------------------------
/BASIC/chapter2.js:
--------------------------------------------------------------------------------
1 | // case 1 삼각형 반복문
2 |
3 | // var result = "";
4 | // for (var i = 0; i < 7; i++) {
5 | // result += "*";
6 | // console.log(result);
7 | // }
8 |
9 | // case 2 피즈버즈
10 | // function FizzBuzz(n) {
11 | // for (var k = 1; k <= n; k++) {
12 | // if (k % 15 == 0) {
13 | // console.log("FizzBuzz");
14 | // } else if (k % 5 == 0) {
15 | // console.log("buzz");
16 | // } else if (k % 3 == 0) {
17 | // console.log("Fizz");
18 | // } else {
19 | // console.log(k);
20 | // }
21 | // }
22 | // }
23 |
24 | // FizzBuzz(100);
25 |
26 | // case 3 체스보드 내 답
27 | var turn = 0;
28 | while (turn < 8) {
29 | turn++;
30 | if (turn % 2 == 0) {
31 | console.log(" # # # #");
32 | } else {
33 | console.log("# # # # ");
34 | }
35 | }
36 |
37 | // case 3 체스보드 솔루션
38 | /*
39 | let size = 8;
40 | let board = "";
41 |
42 | for (let y = 0; y < size; y++) {
43 | for (let x = 0; x < size; x++) {
44 | if ((x + y) % 2 == 0) {
45 | board += " ";
46 | } else {
47 | board += "#";
48 | }
49 | }
50 | board += "\n";
51 | }
52 |
53 | console.log(board);
54 | */
55 |
--------------------------------------------------------------------------------
/BASIC/chapter3.js:
--------------------------------------------------------------------------------
1 | let x = 10;
2 | if (true) {
3 | let y = 20;
4 | var z = 30;
5 | console.log(x + y + z);
6 | }
7 |
8 | console.log(x + z);
9 |
--------------------------------------------------------------------------------
/BASIC/ex.js:
--------------------------------------------------------------------------------
1 | /* 프로퍼티 */
2 |
3 | // const person1 = {
4 | // name: "LEE JUN HEE",
5 | // age: 25,
6 | // };
7 |
8 | // console.log(person1.name);
9 |
10 | // let doh = "Doh";
11 |
12 | // console.log(typeof doh.toUpperCase);
13 |
14 | // console.log(doh.toUpperCase());
15 |
16 | /* 함수와 메소드 */
17 |
18 | // function AnythingCanUpper(string) {
19 | // let result = string.toUpperCase(string);
20 | // console.log(result);
21 | // }
22 |
23 | // AnythingCanUpper("upper2");
24 |
25 | // var upper = "upper";
26 |
27 | // console.log(upper.toUpperCase());
28 |
29 | /* 객체의 접근 */
30 |
31 | /*
32 | let day1 = {
33 | squirrel: false,
34 | events: ["work", "touched tree", "pizza", "running"],
35 | morning: {
36 | squirrel: false,
37 | events: ["work", "touched tree"],
38 | inner: {
39 | events: {
40 | work() {
41 | return "work";
42 | },
43 | touchedTree() {
44 | return "touched tree";
45 | },
46 | },
47 | },
48 | },
49 | };
50 | console.log(day1.squirrel);
51 |
52 | console.log(day1.wolf); // 객체내에 정의되지 않음
53 |
54 | console.log(day1.morning.inner.events.touchedTree());
55 | */
56 |
57 | /* 객체의 변형과 참조 */
58 |
59 | /*
60 | // case 1, 동일한 객체에 두개의 참조가 있는 경우
61 | const object1 = { value: 10 };
62 | const object2 = object1;
63 |
64 | // case 2, 다른 객체가 같은 속성 { value : 10 }을 가지고 있는 경우
65 | const object3 = { value: 10 };
66 |
67 | console.log(object1 == object2);
68 |
69 | console.log(object1 === object2);
70 |
71 | console.log(object1 == object3);
72 |
73 | // value 의 값을 변경
74 | object1.value = 15;
75 |
76 | console.log(object1.value);
77 |
78 | console.log(object2.value);
79 |
80 | console.log(object3.value);
81 | */
82 |
83 | /*
84 | const score = { visitors: 0, home: 0 };
85 |
86 | score.visitors = 1;
87 |
88 | console.log(score);
89 |
90 | score = { visitors: 1, home: 1 };
91 |
92 | console.log(score);
93 | */
94 |
95 | /*
96 | Queue를 통해 관리하는 Array객체의 메서드 unshift, shift
97 |
98 | let todoList = [];
99 | function remember(task) {
100 | todoList.push(task);
101 | }
102 | function getTask() {
103 | return todoList.shift();
104 | }
105 | function rememberUrgently(task) {
106 | todoList.unshift(task);
107 | }
108 |
109 | remember("멍멍이");
110 | console.log(todoList);
111 | remember("야옹이");
112 | console.log(todoList);
113 |
114 | console.log(getTask());
115 | console.log(todoList);
116 | rememberUrgently("멍멍이");
117 | console.log(todoList);
118 | */
119 |
120 | /*
121 | JSON 객체 사용
122 |
123 | let string = JSON.stringify({ squirrel: false, events: ["weekend"] });
124 |
125 | console.log(string);
126 |
127 | console.log(JSON.parse(string).squirrel);
128 | console.log(JSON.parse(string).events);
129 | */
130 |
131 | /*
132 | var let const
133 |
134 | const halve = function (n) {
135 | return n / 2;
136 | };
137 | console.log(halve(100));
138 | var n = 10;
139 | console.log(halve(n));
140 | var n = 20;
141 | console.log(halve(n));
142 | */
143 |
144 | /*
145 | function speak(line) {
146 | console.log(`The ${this.type} rabbits says '${line}'`);
147 | }
148 |
149 | let whiteRabbit = { type: "white", speak };
150 | let hungryRabbit = { type: "hungry", speak };
151 |
152 | whiteRabbit.speak("Oh my ears and whiskers, " + "how late it's getting");
153 |
154 | hungryRabbit.speak("I could use a carrot right now.");
155 | */
156 |
157 | /*
158 | function normalize() {
159 | console.log(this.coords.map((n) => n / this.length));
160 | }
161 |
162 | normalize.call({ coords: [0, 2, 3], length: 5 });
163 | */
164 |
165 | /*
166 | let empty = {};
167 |
168 | console.log(empty.toString);
169 | // function toString(){...}
170 |
171 | console.log(empty.toString());
172 | // [object object]
173 | */
174 |
175 | /*
176 | let protoRabbit = {
177 | speak(line) {
178 | console.log(`The ${this.type} rabbit says '${line}'`);
179 | },
180 | };
181 |
182 | let killerRabbit = Object.create(protoRabbit);
183 |
184 | killerRabbit.type = "killer";
185 | // type을 설정
186 | killerRabbit.speak(" SKREEEEE! ");
187 | // speak()에 인수로 문자열 " SKREEEEE! " 를 넣어주고 호출했기 때문에 해당 함수가 실행된다.
188 |
189 | killerRabbit.type;
190 | killerRabbit.speak(" SKRRRR! SKRRRR! ");
191 | */
192 |
193 | /*
194 | function Rabbit(type) {
195 | this.type = type;
196 | }
197 | Rabbit.prototype.speak = function (line) {
198 | console.log(`The ${this.type} rabbit says '${line}'`);
199 | };
200 |
201 | let weirdRabbit = new Rabbit("Weird");
202 | weirdRabbit.speak("bow wow!");
203 | */
204 |
205 | // console.log("toString" in Object("Jack"));
206 |
207 | /*
208 | // Human class
209 | class Human {
210 | constructor(name, age, sex) {
211 | this.name = name;
212 | this.age = age;
213 | this.sex = sex;
214 | }
215 | sleep() {
216 | console.log("zzz");
217 | }
218 | eat() {
219 | console.log("냠냠");
220 | }
221 | }
222 | // Human class의 자식 class인 Student class
223 | // Human class가 가지고 있는 속성인 name, sex, age를 super를 통해 가지고 오고, 고유의 속성인 grade와 school이 추가 되었다.
224 | class Student extends Human {
225 | constructor(name, sex, age, grade, school) {
226 | super(name, sex, age);
227 | this.grade = grade;
228 | this.school = school;
229 | }
230 | // 공부하는 기능도 추가되었다.
231 | study() {
232 | console.log(
233 | `${this.school}에 다니는 ${this.grade} ${this.name}은(는) 열심히 공부합니다`
234 | );
235 | }
236 | }
237 |
238 | const student1 = new Student("영수", "남성", 19, "고 3", "인덕원 고등학교");
239 |
240 | student1.eat();
241 |
242 | student1.study();
243 | */
244 |
245 | /*
246 | function canYouSpotTheProblem() {
247 | "use strict";
248 | for (counter = 0; counter < 10; counter++) {
249 | console.log("Happy happy");
250 | }
251 | }
252 | canYouSpotTheProblem();
253 | */
254 |
255 | /*
256 | "use strict";
257 | function Person(name) {
258 | this.name = name;
259 | }
260 | let ferdinand = new Person("Ferdinand");
261 | console.log(ferdinand.name);
262 | */
263 |
264 | /*
265 | function promptDirection(question) {
266 | let result = prompt(question);
267 | if (result.toLocaleLowerCase() == "left") return "L";
268 | if (result.toLocaleLowerCase() == "right") return "R";
269 | throw new Error("Invalid direction: " + result);
270 | }
271 |
272 | function lock() {
273 | if (promptDirection("Which way?") == "L") {
274 | return "a house";
275 | } else {
276 | return "two angry bears";
277 | }
278 | }
279 |
280 | try {
281 | console.log("You see", look());
282 | } catch (error) {
283 | console.log("Something went wrong: " + error);
284 | }
285 | */
286 |
287 | /*
288 | function square(x) {
289 | if (arguments.length > 1) {
290 | console.log(arguments[1]);
291 | console.log(arguments[2]);
292 | }
293 | return x * x;
294 | }
295 |
296 | console.log(square(4, true, "Hedge hog"));
297 | */
298 |
299 | /*
300 | let sequence = [1, 2, 3];
301 |
302 | console.log(sequence.push(4));
303 | */
304 |
--------------------------------------------------------------------------------
/BASIC/public/Async_Sync.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/BASIC/public/Async_Sync.png
--------------------------------------------------------------------------------
/BASIC/public/async.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/BASIC/public/async.png
--------------------------------------------------------------------------------
/BASIC/public/async2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/BASIC/public/async2.png
--------------------------------------------------------------------------------
/BASIC/public/http.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/BASIC/public/http.png
--------------------------------------------------------------------------------
/BASIC/public/polymorphism.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/BASIC/public/polymorphism.png
--------------------------------------------------------------------------------
/BASIC/public/promise.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/BASIC/public/promise.png
--------------------------------------------------------------------------------
/BASIC/public/url.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/BASIC/public/url.png
--------------------------------------------------------------------------------
/BASIC/public/www.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/BASIC/public/www.png
--------------------------------------------------------------------------------
/DEEPDIVE/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
--------------------------------------------------------------------------------
/DEEPDIVE/MDN.js:
--------------------------------------------------------------------------------
1 | /*
2 | 정적 메서드만 지원하는 Math 빌트인 객체의 경우 인스턴스를 생성하지 않더라도 사용이 가능하다.
3 |
4 | - Math.floor()
5 | - Math.max()
6 | - Math.ceil()
7 | ...
8 | */
9 |
10 | // console.log(Math.floor(2.5));
11 |
12 | // const num1 = 2.5;
13 | // console.log(Math.floor(num1));
14 |
15 | // console.log(typeof num1);
16 |
17 | /*
18 | 하지만
19 |
20 | String.prototype.toUpperCase()
21 | String.prototype.toLowerCase()
22 |
23 | 와 같이 프로토타입 프로퍼티에 속해있는 메서드인 경우 인스턴스를 생성하지 않으면 사용이 불가능하다.
24 |
25 | console.log(String.toUpperCase("hi")); // String.toUpperCase is not a function
26 | */
27 |
28 | /* 일반적인 변수 선언 */
29 |
30 | const UPPER = "hi";
31 |
32 | console.log(UPPER);
33 |
34 | console.log("typeof:", typeof UPPER); // typeof: string why ? 자바스크립트 엔진에 의해 문자열로 암묵적 형변환이 되었다
35 |
36 | console.log("UPPER.prototype: ", UPPER.prototype); // undefined new 연산자를 통해 생성한 인스턴스가 아니기 때문에 prototype 프로퍼티를 갖지는 않는다
37 |
38 | console.log("UPPER.constructor:", UPPER.constructor); // [Function: String]
39 |
40 | console.log("UPPER.toUpperCase():", UPPER.toUpperCase()); // UPPER.toUpperCase(): HI
41 |
42 | console.log("------------------------------------");
43 |
44 | /* new 연산자를 통해 생성자 함수로 인스턴스 생성 */
45 |
46 | const LOWER = new String("HI");
47 |
48 | console.log(LOWER); // [String: 'HI']
49 |
50 | console.log(typeof LOWER); // object
51 |
52 | console.log(LOWER.prototype); // undefined
53 |
54 | console.log(LOWER.constructor); // [Function: String]
55 |
56 | console.log(LOWER.toLowerCase()); // hi
57 |
58 | /*
59 | 21.3 원시값과 래퍼 객체
60 | */
61 |
--------------------------------------------------------------------------------
/DEEPDIVE/ajax.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
41 |
42 |
--------------------------------------------------------------------------------
/DEEPDIVE/callback.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
37 |
38 |
--------------------------------------------------------------------------------
/DEEPDIVE/callbackhell.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
11 |
45 |
46 |
--------------------------------------------------------------------------------
/DEEPDIVE/captureBubble.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
19 |
20 | Click me
21 |
22 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/DEEPDIVE/closure.js:
--------------------------------------------------------------------------------
1 | /*
2 | let num = 0;
3 |
4 | function plusNum() {
5 | num++;
6 | }
7 |
8 | console.log(num);
9 | plusNum();
10 | console.log(num);
11 |
12 | // 수억개의 코드
13 |
14 | num = 200;
15 |
16 | console.log(num); // num 값이 쉽게 변경됨
17 | */
18 |
19 | function closure() {
20 | let num = 10;
21 |
22 | function plusNum() {
23 | num += 1;
24 | }
25 |
26 | function printNum() {
27 | console.log(num);
28 | }
29 |
30 | function setNum(val) {
31 | num = val;
32 | }
33 |
34 | // 함수를 객체 형식으로 리턴하는 이유는 새로 생성한 변수를 (.) 연산자를 통해 (객체와 같은 방식으로) 접근하기 위해서
35 | // 함수뿐만 아니라 지역 변수도 리턴이 가능하다 (하지만 추천하지 않음)
36 | // 객체 형식으로 담아서 리턴될 경우에, closure 내부에 정의된 함수 외에도 지역 변수의 값을 변경하는 경우가 생기기 때문에 (객체는 가변성의 성질을 가지므로)
37 |
38 | return { num, plusNum, printNum, setNum };
39 | }
40 |
41 | // console.log("num is:", num); // num is not defined, 상위 스코프에서 하위 스코프로 식별자 검색을 할 수 없음
42 |
43 | const newNum = closure(); // closure 함수로 newNum 함수를 생성한다.
44 |
45 | console.log(newNum); // 생성된 함수객체 newNum은 closure 함수가 리턴하는 객체 형식의 프로퍼티와 메서드가 들어있음
46 |
47 | console.log((newNum.num = 20)); // newNum.num 에 값을 할당 (closure 함수의 메서드를 사용하지 않고 직접 변경)
48 | console.log(newNum); // 객체형식으로 리턴되는 newNum의 특성상 newNum의 프로퍼티인 num의 값이 재할당됨
49 |
50 | newNum.printNum(); // 하지만 printNum 메서드를 사용하면 기존의 10 출력
51 |
52 | newNum.setNum(100); // 따라서 지역 변수 num을 변경하기 위해서는 새로운 메서드를 정의하여 값을 전달함으로서 부수효과를 줄어야함
53 |
54 | newNum.printNum(); // 100 출력
55 |
56 | // 하지만 지역 변수를 리턴하더라도 원시 타입의 값은 불변성의 성질을 가지기 때문에, 재할당하지 않는 이상 값을 변화시킬 수 없다.
57 | // 따라서 함수를 통해 반환하여 사용하는 것이 올바르다.
58 |
--------------------------------------------------------------------------------
/DEEPDIVE/debounce.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/DEEPDIVE/error.js:
--------------------------------------------------------------------------------
1 | try {
2 | // 에러 객체를 던지면 catch 코드 블록이 실행되기 시작한다.
3 | throw new Error("something wrong");
4 | } catch (error) {
5 | console.log(error);
6 | }
7 |
--------------------------------------------------------------------------------
/DEEPDIVE/event.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Event Delegation
6 |
7 |
58 |
59 |
62 |
63 |
64 |
78 |
79 |
98 |
99 |
100 |
101 |
--------------------------------------------------------------------------------
/DEEPDIVE/event2.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
39 |
40 |
41 |
48 |
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/DEEPDIVE/eventDelegation.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | eventDelegation
6 |
7 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/DEEPDIVE/evntloop.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
35 |
36 |
--------------------------------------------------------------------------------
/DEEPDIVE/ex.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
26 |
27 |
28 |
29 |
30 |
31 |
61 |
62 |
--------------------------------------------------------------------------------
/DEEPDIVE/ex.js:
--------------------------------------------------------------------------------
1 | var foo;
2 | console.log(typeof foo); // undefined
3 |
4 | foo = 3;
5 | console.log(typeof foo); // number
6 |
7 | foo = "Hello";
8 | console.log(typeof foo); // string
9 |
10 | foo = true;
11 | console.log(typeof foo); // boolean
12 |
13 | foo = null;
14 | console.log(typeof foo); // object
15 |
16 | foo = Symbol(); // 심벌
17 | console.log(typeof foo); // symbol
18 |
19 | foo = {}; // 객체
20 | console.log(typeof foo); // object
21 |
22 | foo = []; // 배열
23 | console.log(typeof foo); // object
24 |
25 | foo = function () {}; // 함수
26 | console.log(typeof foo); // function
27 |
28 | let foo2 = 10;
29 | console.log(foo2);
30 |
31 | const foo3 = 20;
32 | console.log(foo3);
33 |
--------------------------------------------------------------------------------
/DEEPDIVE/ex2.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
11 |
12 |
--------------------------------------------------------------------------------
/DEEPDIVE/ex3.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/DEEPDIVE/fetch.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
11 |
70 |
71 |
--------------------------------------------------------------------------------
/DEEPDIVE/fetchResponse.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
19 |
20 |
--------------------------------------------------------------------------------
/DEEPDIVE/gitFetch.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
11 |
22 |
23 |
--------------------------------------------------------------------------------
/DEEPDIVE/images/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/1.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/11_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/11_1.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/11_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/11_2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/11_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/11_3.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/11_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/11_4.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/11_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/11_7.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/11_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/11_8.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/11_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/11_9.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/12_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/12_1.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/12_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/12_2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/12_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/12_5.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/12_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/12_6.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/12_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/12_7.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/12_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/12_8.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/13_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/13_1.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/13_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/13_2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/13_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/13_3.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/15_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/15_3.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/19_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/19_1.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/19_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/19_10.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/19_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/19_11.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/19_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/19_2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/19_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/19_9.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/25_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/25_1.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/25_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/25_2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/26.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/26.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/26_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/26_2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/27.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/27.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/27_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/27_2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/28.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/28.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/29_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/29_1.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/29_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/29_2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/30_1.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/30_1.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/30_10.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/30_10.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/30_11.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/30_11.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/30_12.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/30_12.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/30_13.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/30_13.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/30_2.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/30_2.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/30_3.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/30_3.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/30_4.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/30_4.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/30_5.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/30_5.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/30_6.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/30_6.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/30_7.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/30_7.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/30_8.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/30_8.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/30_9.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/30_9.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/31_1.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/31_1.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/31_2.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/31_2.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/31_3.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/31_3.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/31_4.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/31_4.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/31_5.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/31_5.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/32_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/32_1.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/32_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/32_2.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/33_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/33_1.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/33_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/33_2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/33_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/33_3.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/33_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/33_4.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/34_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/34_1.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/35_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/35_1.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/35_10.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/35_10.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/35_11.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/35_11.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/35_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/35_2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/35_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/35_3.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/35_4.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/35_4.jpeg
--------------------------------------------------------------------------------
/DEEPDIVE/images/35_5.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/35_5.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/35_7.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/35_7.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/35_8.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/35_8.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/35_9.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/35_9.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/36_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/36_1.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/36_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/36_10.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/36_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/36_11.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/36_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/36_2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/36_3.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/36_3.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/36_4.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/36_4.JPG
--------------------------------------------------------------------------------
/DEEPDIVE/images/36_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/36_5.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/36_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/36_6.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/36_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/36_7.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/36_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/36_8.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/36_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/36_9.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/37_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/37_1.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/37_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/37_2.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/37_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/37_3.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/37_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/37_4.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/37_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/37_5.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/37_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/37_6.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/38_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/38_1.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/38_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/38_2.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/39_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/39_1.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/39_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/39_2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/39_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/39_3.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/39_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/39_4.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/39_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/39_5.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/40_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/40_1.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/40_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/40_2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/40_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/40_3.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/40_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/40_4.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/41_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/41_1.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/41_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/41_2.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/41_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/41_3.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/41_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/41_4.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/41_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/41_5.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/41_6.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/41_6.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/42_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/42_1.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/4_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/4_9.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/5_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/5_2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/async.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/async.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/closure1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/closure1.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/closure2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/closure2.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/closure3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/closure3.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/coca.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/coca.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/debounce.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/debounce.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/debounce2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/debounce2.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/delete.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/delete.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/dir.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/dir.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/get.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/get.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/get_one.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/get_one.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/gocha1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/gocha1.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/gocha2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/gocha2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/loopResult.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/loopResult.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/memory.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/memory.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/memory2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/memory2.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/memory3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/memory3.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/nonSleep.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/nonSleep.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/patch.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/patch.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/pepsi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/pepsi.png
--------------------------------------------------------------------------------
/DEEPDIVE/images/post.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/post.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/proto21.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/proto21.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/proto22.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/proto22.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/proto23.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/proto23.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/proto24.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/proto24.jpg
--------------------------------------------------------------------------------
/DEEPDIVE/images/put.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/put.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/sleep.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/sleep.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/throttle.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/throttle.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/throttle2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/throttle2.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/timer.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/timer.gif
--------------------------------------------------------------------------------
/DEEPDIVE/images/window_console.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junh0328/upgrade_javascript/045b5dca6c23c7d95fe1572f7af9a1986ee9b966/DEEPDIVE/images/window_console.png
--------------------------------------------------------------------------------
/DEEPDIVE/loop.js:
--------------------------------------------------------------------------------
1 | function printNum(n) {
2 | console.log(n);
3 | }
4 |
5 | printNum(1);
6 | setTimeout(() => printNum(2), 3000);
7 | setTimeout(() => printNum(3), 2000);
8 | setTimeout(() => printNum(4), 1000);
9 | printNum(5);
10 |
--------------------------------------------------------------------------------
/DEEPDIVE/mouse.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
11 |
12 |
13 |
26 |
27 |
--------------------------------------------------------------------------------
/DEEPDIVE/nodeFetch.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
11 |
24 |
25 |
--------------------------------------------------------------------------------
/DEEPDIVE/promise.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
11 |
43 |
44 |
--------------------------------------------------------------------------------
/DEEPDIVE/scope.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
19 |
20 |
--------------------------------------------------------------------------------
/DEEPDIVE/serial.js:
--------------------------------------------------------------------------------
1 | const obj = {
2 | name: "Lee",
3 | age: 20,
4 | alive: true,
5 | hobby: ["traveling", "tennis"],
6 | };
7 |
8 | // 객체를 JSON 포맷의 문자열로 변환한다.
9 | const json = JSON.stringify(obj);
10 | console.log(typeof json, json);
11 |
12 | // 객체를 JSON 포맷의 문자열로 변환하면서 들여쓰기 한다.
13 | const prettyJson = JSON.stringify(obj, null, 2);
14 | console.log(typeof prettyJson, prettyJson);
15 |
16 | // replacer 함수. 값의 타입이 Number이면 필터링되어 반환되지 않는다.
17 | function filter(key, value) {
18 | return typeof value === "number" ? undefined : value;
19 | }
20 |
21 | const strFilteredObject = JSON.stringify(obj, filter, 2);
22 | console.log(typeof strFilteredObject, strFilteredObject);
23 |
--------------------------------------------------------------------------------
/DEEPDIVE/taskQueue.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
11 |
36 |
37 |
--------------------------------------------------------------------------------
/DEEPDIVE/throttle.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
17 |
18 |
19 |
22 |
23 | 일반 이벤트 핸들러가 scroll 이벤트를 처리한 횟수:
24 | 0
25 |
26 |
27 | 스로틀 이벤트 핸들러가 scroll 이벤트를 처리한 횟수:
28 | 0
29 |
30 |
31 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/DEEPDIVE/time.js:
--------------------------------------------------------------------------------
1 | (function printNow() {
2 | const today = new Date();
3 |
4 | const dayNames = [
5 | "(일요일)",
6 | "(월요일)",
7 | "(화요일)",
8 | "(수요일)",
9 | "(목요일)",
10 | "(금요일)",
11 | "(토요일)",
12 | ];
13 | // getDay 메서드는 해당 요일(0 ~ 6)을 나타내는 정수를 반환한다.
14 | const day = dayNames[today.getDay()];
15 |
16 | const year = today.getFullYear();
17 | const month = today.getMonth() + 1;
18 | const date = today.getDate();
19 | let hour = today.getHours();
20 | let minute = today.getMinutes();
21 | let second = today.getSeconds();
22 | const ampm = hour >= 12 ? "PM" : "AM";
23 |
24 | // 12시간제로 변경
25 | hour %= 12;
26 | hour = hour || 12; // hour가 0이면 12를 재할당
27 |
28 | // 10미만인 분과 초를 2자리로 변경
29 | minute = minute < 10 ? "0" + minute : minute;
30 | second = second < 10 ? "0" + second : second;
31 |
32 | const now = `${year}년 ${month}월 ${date}일 ${day} ${hour}:${minute}:${second} ${ampm}`;
33 |
34 | console.log(now);
35 |
36 | // 1초마다 printNow 함수를 재귀 호출한다. 41.2.1절 "setTimeout / clearTimeout" 참고
37 | setTimeout(printNow, 1000);
38 | })();
39 |
--------------------------------------------------------------------------------
/DEEPDIVE/timer.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 일반 클릭 이벤트 카운터 0
6 | 디바운스 클릭 이벤트 카운터 0
7 | 스로틀 클릭 이벤트 카운터 0
8 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/DEEPDIVE/timer.js:
--------------------------------------------------------------------------------
1 | let count = 1;
2 |
3 | const timeoutId = setInterval(() => {
4 | console.log(count); // 1 2 3 4 5
5 |
6 | if (count++ === 5) clearInterval(timeoutId);
7 | }, 1000);
8 |
9 | console.log("timeoutId: ", timeoutId);
10 |
--------------------------------------------------------------------------------
/ES6/SECTION01/readme.md:
--------------------------------------------------------------------------------
1 | ## let, const 변수
2 |
3 | ### 변수 구분
4 |
5 | 로컬(지역)변수, 글로벌(전역)변수
6 | 변수를 구분하는 이유는?
7 |
8 | - 기능과 목적이 다르기 때문
9 |
10 | 글로벌 변수의 기능, 목적
11 |
12 | - 다른 js 파일에서 변수의 값을 공유
13 | - 파일에서 공통 변수 개념으로 사용
14 | - 의도는 좋으나 처리 속도가 떨어짐
15 |
16 | 로컬 변수의 기능, 목적
17 |
18 | - 빠르게 식별자를 해결하기 위해 가까운 스코프의 변수를 사용하려는 것
19 | - 스코프란 범위라는 뜻으로, 중괄호(=블럭) {...} 내부에 선언된 식(코드)를 말한다.
20 |
21 | ```js
22 | // "use strict";
23 | value = 100;
24 | function point() {
25 | value = 300;
26 | console.log('함수:', value);
27 | }
28 | point();
29 |
30 | >>> 함수: 300
31 | /*
32 | 글로벌 변수로 값을 할당한 value는 다른 파일에서도 이 변수를 사용할 수 있기 때문에,
33 | 함수 안에서 글로벌 변수의 값을 바꾸는 것은 좋지 않다.
34 | but, 작동은 됨
35 | */
36 | ```
37 |
38 | ```js
39 | 'use strict';
40 |
41 | debugger;
42 |
43 | function point() {
44 | try {
45 | value = 300;
46 | } catch (e) {
47 | console.error(e);
48 | console.log('글로벌 변수 사용 불가');
49 | }
50 | }
51 | point();
52 |
53 | >>> value is not defined;
54 | >>> 글로벌 변수 사용 불가
55 |
56 | /*
57 | 따라서 규칙을 지켜주기 위해 'use strict'를 사용한다.
58 | 결과는 적으로 글로벌 변수를 함수 안에서 값을 바꿔 사용하지 말라는 내용과 함께
59 | 에러가 발생하게 된다.
60 | */
61 | ```
62 |
63 | > ES6 부터는 이 'use strict'가 default environment이다
64 | > 'use strict'를 선언하고 코드를 작성하는 것이 안정적일 것이다
65 |
66 |
67 |
68 | ## 블록 스코프
69 |
70 | 블록 기준
71 |
72 | - 중괄호 {코드}
73 | - function name(){코드}
74 | - if(a===1){코드}
75 |
76 | 블록 안과 밖이 스코프가 다름
77 |
78 | - 변수이름이 같아도 값이 대체되지 않음
79 |
80 | 스코프에 같은 이름 사용 불가
81 |
82 | ### function 블록 스코프
83 |
84 | function 안과 밖에 같은 이름의 let 변수 선언이 가능하다
85 |
86 | - 스코프가 다르기 때문
87 |
88 | ```js
89 | let sports = '축구';
90 | if (sports) {
91 | let sports = '농구'; // 블록 {...}, 안에서 생성된 변수는 밖의 변수명과 같아도 각각 존재하게 된다
92 | console.log('안: ', sports);
93 | }
94 | console.log('밖: ', sports);
95 |
96 | >>>
97 | 안 : 농구
98 | 밖 : 축구
99 | ```
100 |
101 | function 밖의 let 변수를
102 |
103 | - function 안에서 사용 가능(클로저)
104 |
105 | ```js
106 | let sports = '축구';
107 | function show() {
108 | console.log(sports);
109 | }
110 | show();
111 |
112 | >>>
113 | 축구
114 | ```
115 |
116 | ### try-catch 블록 스코프
117 |
118 | try 블록 { } 기준으로 안과 밖에 같은 이름의 let 변수 선언이 가능
119 | 하지만, catch() 문에서는 try 밖의 변수 사용 가능
120 |
121 | ```js
122 | let sports = '축구';
123 | try {
124 | let sports = '농구';
125 | console.log('안: ', sports);
126 | abc = error;
127 | } catch (e) {
128 | console.log('catch: ', sports); // catch() 문에서는 try 밖의 변수 사용 가능
129 | }
130 | console.log('밖: ', sports);
131 |
132 | >>>
133 | 안 : 농구
134 | catch : 축구
135 | 밖 : 축구
136 | ```
137 |
138 |
139 |
140 | ## let 변수 개요
141 |
142 | ```js
143 | let book = '책';
144 | if(book){
145 | let book = "책방";
146 | console.log(book); >> 책방 // let 변수는 블록 스코프에 따라 값이 각각 존재한다.
147 | }
148 | console.log(book); >> 책
149 |
150 | /*
151 | var 변수였다면, 해당 값을 덮어 씌워서 마지막에 할당된 값 ("책방")이 출력됐을 것
152 | 이것이 블록 스코프를 가지는 let 변수의 특징이다.
153 | */
154 | ```
155 |
156 | - 블록 스코프를 가진 변수
157 | - 변수가 선언된 블록이 스코프
158 |
159 | 스코프 적용 기준
160 |
161 | - 블록{}, 문, 표현식
162 |
163 | 블록{}안과 밖이 스코프가 다름
164 |
165 | - 변수 이름이 같아도 값이 대체되지 않음
166 |
167 | ### let 변수 선언
168 |
169 | 값을 할당하지 않고 변수만 선언할 수 있습니다.
170 | 초깃값으로 undefined가 할당됩니다.
171 | 콤마로 구분하여 다수를 선언할 수 있습니다.
172 |
173 | ```js
174 | let book;
175 | let sport1, sport2;
176 | ```
177 |
178 | ### let 변수와 this
179 |
180 | 글로벌 오브젝트에서 let 변수를 this로 참조 불가
181 |
182 | ```js
183 | var music = '음악';
184 | let sports = '축구';
185 |
186 | console.log(this.music, this.sports);
187 |
188 | >>>
189 | 음악, undefined
190 |
191 | /*
192 | let 변수는 글로벌 오브젝트로 선언해도 window 오브젝트에 설정되지 않습니다.
193 |
194 | var 변수는 선언되기 때문에 this 로 참조하여 음악이라는 값을 가져올 수 있지만,
195 | let 변수는 선언되지 않기 때문에 값을 할당하지 않았다는 undefined가 출력됩니다.
196 | */
197 | ```
198 |
199 | ### 다수의 js 파일 사용 정리
200 |
201 | 글로벌 오브젝트에 작성
202 |
203 | ```js
204 | var globalVar = 'var 변수'; // 글로벌 오브젝트에 설정되어 window 오브젝트에 공유
205 | let globalLet = 'let 변수'; // Script에 설정되어 공유 (window 오브젝트에 저장되지는 않지만 값을 공유한다는 측면은 같음)
206 |
207 | {
208 | let globalBlock = 'block 변수'; // 블록 스코프에 작성되면 공유하지 않고, 블록 내부에서만 쓸 수 있는 변수로 만들어짐 (local 변수)
209 | }
210 | ```
211 |
212 | - var 변수 : window 오브젝트에 설정, 공유
213 | - let 변수 : Script에 설정, 공유
214 |
215 | > window.sports = {...} 처럼 의도적으로 작성하지 않아도 됨
216 |
217 | - { let 변수 } : Block {}에 설정, 공유하지 않음
218 | > 글로벌 오브젝트에서만 사용하는 로컬 변수로 사용
219 |
220 | 함수에 작성
221 |
222 | ```js
223 | function showLocal() {
224 | var localVar = 'var 변수';
225 | let localLet = 'let 변수';
226 | {
227 | let blockLet = 'block 변수';
228 | // 블록 스코프 안에서는 위에 선언한 localVar, localLet을 사용할 수 있지만, 위에서는 사용 불가
229 | // why? 블록 내부에서만 선언된 지역(local) 변수이기 때문
230 | }
231 | }
232 | ```
233 |
234 | - var 변수, let 변수 : Local;
235 | - { let 변수} : Block;
236 |
237 |
238 |
239 | ## 호이스팅
240 |
241 | ES5의 실행 콘텍스트 처리 순서
242 |
243 | - 1. 함수 선언문 설정
244 | - 2. 변수 이름을 바인딩 변숫값은 undefined
245 | - 3. 소스코드 실행
246 |
247 | ```js
248 | console.log('music 변수: ', music);
249 | var music = '음악';
250 |
251 | >>>
252 | music 변수 : undefined
253 | // music 이라는 변수를 사용해서 값을 구할 수는 있지만, 실제로 값이 함수보다 늦게 선언되었기 때문에 undefined가 나온다.
254 | // 이처럼 변수가 코드보다 밑에서 선언되더라도 변수값은 비어있지만 끌어다가 사용할 수 있는 것을 호이스팅이라고 합니다
255 |
256 | /*
257 | 1. music 이라는 변수가 더 늦게 선언되었습니다.
258 | 2. 변수가 아래에 있지만 music 변수를 통해 값을 출력할 수는 있습니다. (실제로는 아직 변수가 밑에 있어서 할당되지 않음)
259 | 3. 아래에 선언된 변수 music을 위의 코드 console에서 땡겨 실행하는 것을 '호이스팅'이라고 합니다.
260 | 4. music이라는 변수의 식별자를 해결하지 못하면 에러가 발생합니다.
261 | */
262 | ```
263 |
264 | let 변수는 호이스팅되지 않음
265 |
266 | - 즉, let 변수 앞에서 변수 사용 불가
267 |
268 | ```js
269 | try {
270 | console.log(sports);
271 | } catch (e) {
272 | console.error(e);
273 | console.log('호이스팅 불가');
274 | }
275 | let sports = '축구';
276 |
277 | >>>
278 | ReferenceError: Cannot access 'sports' before initialization
279 | 호이스팅 불가
280 |
281 | // sports 변수가 초기화 되기 전에 접근할 수 없습니다
282 | ```
283 |
284 | let 변수를 인식하는 시점
285 |
286 | ```js
287 | 'use strict';
288 | debugger;
289 |
290 | console.log('변수 호출 :', globalVar);
291 | debugger;
292 |
293 | var globalVar = 'var 변수';
294 | debugger;
295 |
296 | try {
297 | console.log(globalLet);
298 | } catch (e) {
299 | console.error(e);
300 | console.log('globalLet 인식하지 못함');
301 | }
302 |
303 | let globalLet = 'let 변수';
304 | debugger;
305 |
306 | console.log(globalLet);
307 | debugger;
308 |
309 | >>>
310 | 변수 호출 : undefined
311 | Cannot access 'globalLet' before initialization
312 | globalLet 인식하지 못함
313 | let 변수
314 |
315 | /*
316 | var 로 선언한 변수는 선언문이 해당 변수를 부르는 메소드보다 밑에 있더라도 호이스팅에 의해 불러올 수 있다.(값은 undefined)
317 | let 으로 선언한 변수는 호이스팅이 되지 않기 때문에 아예 인식을 하지못하기 때문에 반드시 메소드보다 위에 작성해줘야 한다.
318 | */
319 | ```
320 |
321 |
322 |
323 | ## const 변수
324 |
325 | 값을 바꿀 수 없는 변수 선언
326 | name1 에 변수 이름 작성, 식별자로 사용
327 |
328 | ```js
329 | const sports = '축구';
330 | try {
331 | sports = '농구';
332 | } catch (e) {
333 | console.error(e);
334 | console.log('const 할당 불가');
335 | }
336 |
337 | >>>
338 | Assignment to constant variable.
339 | const 할당 불가
340 | ```
341 |
342 | value1, value2에 초깃값 작성
343 |
344 | - 반드시 값을 작성, 변수 선언만 불가
345 | - 표현식 작성 가능, 평가 결과 사용
346 |
347 | JS에서 상수는 대문자 사용이 관례
348 |
349 | ```js
350 | const bonus = 100;
351 | const POINT = 200;
352 | ```
353 |
354 | 우선 let이 아닌 const 사용 여부를 검토
355 |
356 | - const > let > var 순서로 사용하자
357 |
358 | ### const 변수
359 |
360 | - const 변수 전체를 바꿀 수는 없지만,
361 |
362 | > Object의 프로퍼티 값을 바꿀 수 있음
363 |
364 | ```js
365 | const book = { tilte: '책' };
366 | try {
367 | book = { title: '음악 책' }; // 프로퍼티 전체를 바꿀 수는 없습니다.
368 | } catch {
369 | console.log('const 전체 할당 불가');
370 | }
371 | book.title = '미술 책'; // 프로퍼티(ket: value)의 일부인 값(value)는 바꿀 수 있습니다. (한개 씩만 가능)
372 | console.log(book.title);
373 |
374 | >>>
375 | const 전체 할당 불가
376 | 미술 책
377 | ```
378 |
379 | > 배열의 엘리먼트 값도 바꿀 수 있음
380 |
381 | ```js
382 | const book = ['책'];
383 | try {
384 | book = ['음악 책'];
385 | } catch (e) {
386 | console.log('const 전체 할당 불가');
387 | }
388 | book[0] = '미술 책';
389 | console.log(book[0]);
390 |
391 | >>>
392 | const 전체 할당 불가
393 | 미술 책
394 | ```
395 |
--------------------------------------------------------------------------------
/ES6/SECTION02/arrow.js:
--------------------------------------------------------------------------------
1 | // 화살표 함수에는 없는 것 : 함수 이름, this, arguments
2 |
3 | const myFunc = function () {
4 | console.log(arguments);
5 | };
6 |
7 | // arrow func 에는 arguments가 존재하지 않음
8 | function outter() {
9 | // 따라서 화살표 함수를 감싸는 함수 선언형 outter()를 만들어 감싸준다.
10 | const myFunc2 = () => {
11 | console.log(arguments);
12 | };
13 | myFunc2();
14 | }
15 |
16 | // spread 연산자를 사용하여 arguments를 받아온다.
17 | const myFunc3 = (...args) => {
18 | console.log(args);
19 | };
20 |
21 | var myObj = {
22 | count: 3,
23 | setCounter: function () {
24 | console.log(this.count);
25 | },
26 | };
27 |
28 | myObj.setCounter();
29 |
30 | // case 1
31 |
32 | myFunc(1, 2, 3, 4);
33 |
34 | // arrow func 에는 arguments가 없기 때문에 함수 선언식으로 감싸주어 이를 호출한다. outer(5,6,7,8);
35 | // myFunc2(5, 6, 7, 8);
36 |
37 | // case 2
38 |
39 | outter(5, 6, 7, 8);
40 |
41 | // case 3
42 |
43 | myFunc3(9, 10, 11, 12);
44 |
--------------------------------------------------------------------------------
/ES6/SECTION02/readme.md:
--------------------------------------------------------------------------------
1 | ## Arrow Function
2 |
3 | Arrow의 사전적 의미
4 |
5 | - 화살, 화살표 =>
6 | - 강좌에서는 화살표 함수로 표기
7 |
8 | 코드 형태
9 |
10 | - (param) => { ... }
11 |
12 | ```js
13 |
14 | const multiple = function (a, b) {
15 | return a * b;
16 | };
17 |
18 | const add = (a, b) => {
19 | return a + b;
20 | };
21 |
22 | var result2 = multiple(4, 5);
23 | var result = add(1, 2);
24 |
25 | console.log(result2);
26 | console.log(result);
27 | >>
28 | 20
29 | 3
30 | ```
31 |
32 |
33 | function(){...}의 축약 형태이지만 고려할 사항도 있음
34 | - this 참조가 다름
35 |
36 | ### 함수 블록 사용
37 |
38 | 함수 블록과 return 작성 생략
39 |
40 | ```js
41 | const total = (one, two) => one + two;
42 |
43 | // 함수 블록 {}과 return 을 생략한 형태로 { return one + two }의 결과값과 같습니다
44 | ```
45 |
46 | 함수 블록 {}만 작성한 형태
47 |
48 | ```js
49 | case 1:
50 | const total = (one) => {};
51 | console.log(total(1));
52 |
53 | >>>
54 | undefined
55 |
56 | // why? 리턴문을 작성하지 않았기때문, return 문을 작성하지 않더라도 리턴될 값을 넣어주면 undefined가 아님
57 |
58 | case 2:
59 | const total = (one) => one;
60 | console.log(total(1));
61 |
62 | >>>
63 | 1
64 | ```
65 |
66 | ### 파라미터 사용
67 |
68 | 파라미터가 하나일 때
69 |
70 | ```js
71 | const get = param => param + 20;
72 | console.log(get(10));
73 |
74 | >>>
75 | 30
76 | ```
77 |
78 | 파라미터가 없으면 소괄호만 작성
79 |
80 | ```js
81 | const get = () => 10 + 20;
82 | console.log(get());
83 |
84 | >>>
85 | 30
86 | ```
87 |
88 |
89 |
90 | ## 화살표 함수 구조
91 |
92 | function을 => (화살표)로 표기하는 것이 전부가 아님
93 | 화살표 함수는 일반 함수와 구조가 다름
94 |
95 | - 화살표 함수 나름의 특징이 있음
96 |
97 | ```js
98 | {
99 | debugger;
100 | ('use strict');
101 |
102 | const book = function () {
103 | return 100;
104 | };
105 |
106 | debugger;
107 |
108 | const point = () => 100;
109 |
110 | debugger;
111 | }
112 |
113 | /*
114 | 1. point 함수를 전개하면 prototype과 constructor가 없습니다.
115 | 2. prototype에 메소드를 연결하여 확장할 수 없습니다.
116 | 3. prototype이 없으므로 그만큼 가볍습니다.
117 | 4. 생성자 함수가 없으므로, new 연산자로 인스턴스를 생성할 수 없습니다.
118 | 5. 단독으로 가볍게 쓰기 위함입니다.
119 | 6. 이것이 화살표 함수의 특징이며 용도입니다.
120 | */
121 | ```
122 |
123 | ### arguments 사용 불가
124 |
125 | arguments를 사용할 수 없음
126 | arguments 대신에 rest 파라미터 사용
127 |
128 |
129 |
130 | ## 화살표 함수와 this
131 |
132 | strict 모드에서 함수를 호출할 때
133 |
134 | - 함수 앞에 오브젝트 작성은 필수
135 |
136 | ```js
137 | 'use strict';
138 | function book() {
139 | function getPoint() {
140 | log(this);
141 | }
142 | getPoint();
143 | }
144 |
145 | window.book();
146 |
147 | /*
148 | 1. strict 모드에서는 window.book()처럼 호출하는 함수(book()) 앞에 오브젝트를 작성해야 합니다
149 | 2. 이렇게 하지 않으면 book() 함수 안에서 this 값이 undefined 입니다
150 | 3. 또한, getPoint()처럼 window를 앞에 작성하지 않으면 getPoint()안에서 this 값이 undefined 입니다.
151 | ```
152 |
153 | - 화살표 함수로 해결
154 |
155 | ```js
156 | 'use strict';
157 | var point = 100; // 글로벌 오브젝트로 선언하여, window 오브젝트에 저장및 공유됨
158 | function sports() {
159 | const getPoint = () => {
160 | log(this.point);
161 | };
162 | getPoint();
163 | }
164 | window.sports();
165 |
166 | >>>
167 | 100
168 |
169 | /*
170 | 1. 화살표 함수로 작성하면 getPoint()로 호출할 수 있습니다.
171 | 2. 또한, getPoint() 화살표 함수 안에서 this가 undefined가 아니라 글로벌(window) 오브젝트를 참조합니다.
172 | 3. var point = 100; 을 작성했으므로 100이 출력됩니다.
173 | */
174 | ```
175 |
176 | ### this 가 정적 스코프 참주
177 |
178 | 화살표 함수에서 정적 스코프의 this를 사용
179 | 정적(Lexical) 스코프란
180 |
181 | - 엔진이 해석할 때, 화살표 함수를 만나면
182 | - function 오브젝트를 생성하고
183 | - 화살표 함수가 속한 스코프를 생성한 오브젝트에 바인딩
184 |
185 | 오브젝트에 바인딩된 스코프의 this를
186 |
187 | - 화살표 함수에서 this로 사용
188 |
189 | ```js
190 | var title = '책';
191 | const book = {
192 | show: () => console.log(this.title);
193 | }
194 | book.show();
195 |
196 | /*
197 | 1. 위에서 부터 아래로 읽음
198 | 2. book.show() 함수 호출
199 | 3. book에 들어있는 함수 show가 function 오브젝트를 생성하고
200 | 4. 화살표 함수가 속한 스코프 [ book.show() ]를 생성한 오브젝트에 바인딩
201 |
202 | -- 멈춤
203 | */
204 | ```
205 |
206 | ### 화살표 함수 특징
207 |
208 | function 대신 =>를 사용, 함수 표현식 형태
209 |
210 | - prototype이 없으므로 함수가 가볍다
211 | - constructor가 없으므로 new 연산자로 인스턴스를 생성할 수 없다.
212 |
213 | 화살표 함수에 this가 없다.
214 |
215 | - 화살표 함수로 Function 오브젝트를 생성할 때
216 | - 정적으로 화살표 함수가 속한 스코프의 this를 화살표 함수에 바인딩한다.
217 | - 바인딩된 this 참조가 바뀌지 않으며 화살표 함수에서 this로 사용한다.
218 | - 일반 함수는 call(), apply(), bind() 등으로 바꿀 수 있다.
219 |
220 | 메소드보다 함수로 사용하는 것이 효율성이 높다.
221 |
222 | - 메소드: 생성자 함수( new )에 의해 생성된 인스턴스가 prototype에게 제공받는 함수
223 | - 함수: 오브젝트(String, Number, Global , ...)에 속해 있는 단독의 함수
224 |
--------------------------------------------------------------------------------
/ES6/SECTION03/readme.md:
--------------------------------------------------------------------------------
1 | ## Iteration
2 |
--------------------------------------------------------------------------------
/ES6/SECTION04/readme.md:
--------------------------------------------------------------------------------
1 | ## Spread, Rest
2 |
--------------------------------------------------------------------------------
/ES6/readme.md:
--------------------------------------------------------------------------------
1 | # 🌟자바스크립트 개념 정리하기 (ES6 문법)🌟
2 |
3 | ## 정리 방향
4 |
5 | - ES6 문법의 기본 과정을 배웁니다
6 | - 논리적으로 접근하여 근본을 다룹니다.
7 |
8 | ### 기본 문법
9 |
10 | - let, const, 화살표 함수
11 | - Spread, Rest, Destructuring, default value
12 | - 연산자, getter/setter, Template
13 |
14 | ### 오브젝트에 추가된 함수
15 |
16 | - Number, String, Object
17 | - Array, Math, RegExp
18 |
19 | ### ES6+에 새로 생긴 오브젝트
20 |
21 | - Iterator, Generator, Symbol
22 | - Map, Set, WeakMap, WeakSet
23 |
24 |
25 |
26 | ## 해당 챕터로 바로가기
27 |
28 | ### 챕터 1, let, const 변수
29 |
30 | ### 챕터 2, Arrow Function
31 |
--------------------------------------------------------------------------------
/async/callback.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | console.log('1');
4 | setTimeout(() => {
5 | console.log('2');
6 | }, 1000);
7 | console.log('3');
8 |
9 | // Synchronous callback
10 | function printImmediately(print) {
11 | print();
12 | }
13 |
14 | printImmediately(() => {
15 | console.log('hello');
16 | });
17 | // Asynchronous callback
18 | function printWithDelay(print, timeout) {
19 | setTimeout(print, timeout);
20 | }
21 |
22 | printWithDelay(() => {
23 | console.log('async callback');
24 | }, 2000);
25 |
26 | // Callback Hell example
27 | class UserStorage {
28 | loginUser(id, password, onSuccess, onError) {
29 | setTimeout(() => {
30 | if (
31 | (id === 'ellie' && password === 'dream') ||
32 | (id === 'coder' && password === 'academy')
33 | ) {
34 | onSuccess(id);
35 | } else {
36 | onError(new Error('not found'));
37 | }
38 | }, 2000);
39 | }
40 |
41 | getRoles(user, onSuccess, onError) {
42 | setTimeout(() => {
43 | if (user === 'ellie') {
44 | onSuccess({ name: 'ellie', role: 'admin' });
45 | } else {
46 | onError(new Error('no access'));
47 | }
48 | }, 1000);
49 | }
50 | }
51 |
52 | const userStorage = new UserStorage();
53 | const id = prompt('enter your id');
54 | const password = prompt('enter your passrod');
55 | userStorage.loginUser(
56 | id,
57 | password,
58 | (user) => {
59 | userStorage.getRoles(
60 | user,
61 | (userWithRole) => {
62 | alert(
63 | `Hello ${userWithRole.name}, you have a ${userWithRole.role} role`
64 | );
65 | },
66 | (error) => {
67 | console.log(error);
68 | }
69 | );
70 | },
71 | (error) => {
72 | console.log(error);
73 | }
74 | );
75 |
--------------------------------------------------------------------------------
/async/closure.js:
--------------------------------------------------------------------------------
1 | // let cnt = 0;
2 | // function cntPlus() {
3 | // cnt = cnt + 1;
4 | // }
5 |
6 | // console.log(cnt);
7 | // cntPlus();
8 | // console.log(cnt);
9 |
10 | /*
11 | -- 수 억개의 코드
12 | cnt = 100;
13 | -- 수 억개의 코드
14 | cntPlus();
15 |
16 | console.log(cnt);
17 | */
18 |
19 | function closer() {
20 | let cnt = 0;
21 | function cntPlus() {
22 | cnt = cnt + 1;
23 | }
24 | function printCnt() {
25 | console.log(cnt);
26 | }
27 | function setCnt(num) {
28 | cnt = num;
29 | }
30 | return { cntPlus, printCnt, setCnt };
31 | }
32 | console.log(closer());
33 |
34 | // const func1 = closer();
35 |
36 | // console.log(func1);
37 |
38 | // func1.printCnt();
39 | // func1.cntPlus();
40 | // func1.printCnt();
41 | // func1.setCnt(100);
42 | // func1.printCnt();
43 |
44 | // let cnt = 10;
45 |
46 | // function scope() {
47 | // let cnt = 1;
48 | // console.log(cnt);
49 | // }
50 |
51 | // console.log(cnt);
52 | // scope();
53 |
--------------------------------------------------------------------------------
/async/promise.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | // Promise is a JavaScript object for asynchronous operation
4 | // Producer(제공) vs Consumer(소비)
5 |
6 | // 1. Producer
7 |
8 | // 새로운 프로미스가 만들어 질 때, executor 함수가 바로 실행된다.
9 | // resolve 성공 <-> reject 실패
10 | const promise = new Promise((resolve, reject) => {
11 | // doing some heavy work (network, read files)
12 | console.log('doing something...');
13 | setTimeout(() => {
14 | resolve('ellie');
15 | // reject(new Error('no network'));
16 | }, 2000);
17 | });
18 |
19 | // 2. Consumers: then, catch, finally
20 | // then : 프로미스의 콜백 함수를 정상 실행했을 때 넘어오는 resolve 값이 value로 넘어온다.
21 | // catch : 프로미스의 콜백 함수에 오류가 발생할 시 넘어오는 reject 값이 error로 넘어간다.
22 | // finally : 프로미스의 콜백 함수가 다 종료되면, 마지막으로 무조건 출력된다.
23 | promise
24 | .then((value) => {
25 | console.log(value);
26 | })
27 | .catch((error) => {
28 | console.log(error);
29 | })
30 | .finally(() => {
31 | console.log('done');
32 | });
33 |
34 | // 3. Promise chaining
35 | const fetchNumber = new Promise((resolve, reject) => {
36 | setTimeout(() => resolve(1), 1000);
37 | });
38 |
39 | fetchNumber
40 | .then((num) => num * 2)
41 | .then((num) => num * 3)
42 | .then((num) => {
43 | return new Promise((resolve, reject) => {
44 | setTimeout(() => resolve(num - 1), 1000);
45 | });
46 | })
47 | .then((num) => console.log(num));
48 |
49 | // 4. Error Handling
50 | const getHen = () =>
51 | new Promise((resolve, reject) => {
52 | setTimeout(() => resolve('🔴'), 1000);
53 | });
54 | const getEgg = (hen) =>
55 | new Promise((resolve, reject) => {
56 | setTimeout(() => resolve(`${hen} => 🟡`), 1000);
57 | });
58 | const cook = (egg) =>
59 | new Promise((resolve, reject) => {
60 | setTimeout(() => resolve(`${egg} => 🟠`), 1000);
61 | });
62 |
63 | getHen()
64 | .then((hen) => getEgg(hen))
65 | .catch((error) => {
66 | return '❤';
67 | })
68 | .then((egg) => cook(egg))
69 | .then((meal) => console.log(meal));
70 |
71 | /*
72 | getHen()
73 | .then(getEgg)
74 | .then(egg)
75 | .then(console.log;
76 | */
77 |
--------------------------------------------------------------------------------
/async/readme.md:
--------------------------------------------------------------------------------
1 | # 동기, 비동기 작업
2 |
3 | - 자바스크립트는 동기적인 언어이다.
4 | - 호이스팅이 된 후에 코드가 작성한 순서에 맞춰 동기적으로 실행된다는 말이다.
5 | - var, function과 같은 선언들이 코드의 제일 위로 올라가는 것을 호이스팅이라고 한다.
6 | - 여기서 비동기 함수란 동기 함수와 다르게 호이스팅된 코드 사이에서 언제 실행될지 모르는 함수를 비동기 함수라고 한다.
7 |
8 | ```js
9 |
10 | console.log('1');
11 | setTimeout(()=> {
12 | console.log('2');
13 | }, 1000);
14 | console.log('3');
15 |
16 | >>
17 | 1
18 | 3
19 | 2
20 | ```
21 |
22 | - 자바스크립트의 호이스팅 성격을 바탕으로 생각해본다면 위에 선언된 함수부터 실행하여 1,2,3이 실행되는 것이 맞다.
23 | - 하지만, setTimeOut이라는 브라우저 API를 통해 두번째 문장인 setTimeout() 함수는 브라우저로 넘어간다.
24 | - 그렇기 때문에 뒷 문장으로 넘어가서 console.log('3')을 찍게 되고, 정해진 시간(1초) 후에 콜백 함수를 통해 호출된 console.log('2')가 찍히게 되는 것이다.
25 |
--------------------------------------------------------------------------------
/esnext-project/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
--------------------------------------------------------------------------------
/esnext-project/babel.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"],
3 | "plugins": ["@babel/plugin-proposal-class-properties"]
4 | }
--------------------------------------------------------------------------------
/esnext-project/dist/js/lib.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | Object.defineProperty(exports, "__esModule", {
4 | value: true
5 | });
6 | exports.power = power;
7 | exports.Foo = exports.pi = void 0;
8 | var _excluded = ["a", "b"];
9 |
10 | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
11 |
12 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
13 |
14 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15 |
16 | function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
17 |
18 | function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
19 |
20 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
21 |
22 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
23 |
24 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
25 |
26 | function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
27 |
28 | function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
29 |
30 | function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
31 |
32 | function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
33 |
34 | function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
35 |
36 | // src/js/lib.js
37 | var pi = Math.PI; // ES6 모듈
38 |
39 | exports.pi = pi;
40 |
41 | function power(x, y) {
42 | return Math.pow(x, y); // ES7: 지수 연산자
43 | } // ES6 클래스
44 |
45 |
46 | var _private = /*#__PURE__*/new WeakMap();
47 |
48 | var Foo = /*#__PURE__*/function () {
49 | function Foo() {
50 | _classCallCheck(this, Foo);
51 |
52 | _classPrivateFieldInitSpec(this, _private, {
53 | writable: true,
54 | value: 10
55 | });
56 | }
57 |
58 | _createClass(Foo, [{
59 | key: "foo",
60 | value: // stage 3: 클래스 필드 정의 제안
61 | function foo() {
62 | // stage 4: 객체 Rest/Spread 프로퍼티 제안
63 | var _a$b$c$d = _objectSpread(_objectSpread({}, {
64 | a: 1,
65 | b: 2
66 | }), {}, {
67 | c: 3,
68 | d: 4
69 | }),
70 | a = _a$b$c$d.a,
71 | b = _a$b$c$d.b,
72 | x = _objectWithoutProperties(_a$b$c$d, _excluded);
73 |
74 | return {
75 | a: a,
76 | b: b,
77 | x: x
78 | };
79 | }
80 | }, {
81 | key: "bar",
82 | value: function bar() {
83 | return _classPrivateFieldGet(this, _private);
84 | }
85 | }]);
86 |
87 | return Foo;
88 | }();
89 |
90 | exports.Foo = Foo;
--------------------------------------------------------------------------------
/esnext-project/dist/js/main.js:
--------------------------------------------------------------------------------
1 | // src/js/main.js
2 | import "@babel/polyfill";
3 | import { pi, power, Foo } from "./lib";
4 |
5 | console.log(pi);
6 | console.log(power(pi, pi));
7 |
8 | const f = new Foo();
9 | console.log(f.foo());
10 | console.log(f.bar());
11 |
12 | // polyfill이 필요한 코드
13 | console.log(
14 | new Promise((resolve, reject) => {
15 | setTimeout(() => resolve(1), 100);
16 | })
17 | );
18 |
19 | // polyfill이 필요한 코드
20 | console.log(Object.assign({}, { x: 1 }, { y: 2 }));
21 |
22 | // polyfill이 필요한 코드
23 | console.log(Array.from([1, 2, 3], (v) => v + v));
24 |
--------------------------------------------------------------------------------
/esnext-project/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Document
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/esnext-project/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "esnext-project",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "build": "webpack -w"
9 | },
10 | "keywords": [],
11 | "author": "",
12 | "license": "ISC",
13 | "dependencies": {
14 | "@babel/polyfill": "^7.12.1"
15 | },
16 | "devDependencies": {
17 | "@babel/cli": "^7.15.4",
18 | "@babel/core": "^7.15.5",
19 | "@babel/plugin-proposal-class-properties": "^7.14.5",
20 | "@babel/preset-env": "^7.15.4",
21 | "babel-loader": "^8.2.2",
22 | "webpack": "^5.52.0",
23 | "webpack-cli": "^4.8.0"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/esnext-project/src/js/lib.js:
--------------------------------------------------------------------------------
1 | // src/js/lib.js
2 | export const pi = Math.PI; // ES6 모듈
3 |
4 | export function power(x, y) {
5 | return x ** y; // ES7: 지수 연산자
6 | }
7 |
8 | // ES6 클래스
9 | export class Foo {
10 | #private = 10; // stage 3: 클래스 필드 정의 제안
11 |
12 | foo() {
13 | // stage 4: 객체 Rest/Spread 프로퍼티 제안
14 | const { a, b, ...x } = { ...{ a: 1, b: 2 }, c: 3, d: 4 };
15 | return { a, b, x };
16 | }
17 |
18 | bar() {
19 | return this.#private;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/esnext-project/src/js/main.js:
--------------------------------------------------------------------------------
1 | // src/js/main.js
2 | import { pi, power, Foo } from "./lib";
3 |
4 | console.log(pi);
5 | console.log(power(pi, pi));
6 |
7 | const f = new Foo();
8 | console.log(f.foo());
9 | console.log(f.bar());
10 |
--------------------------------------------------------------------------------
/esnext-project/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require("path");
2 |
3 | module.exports = {
4 | // entry file
5 | // https://webpack.js.org/configuration/entry-context/#entry
6 | entry: ["@babel/polyfill", "./src/js/main.js"],
7 | // 번들링된 js 파일의 이름(filename)과 저장될 경로(path)를 지정
8 | // https://webpack.js.org/configuration/output/#outputpath
9 | // https://webpack.js.org/configuration/output/#outputfilename
10 | output: {
11 | path: path.resolve(__dirname, "dist/js"),
12 | filename: "bundle.js",
13 | },
14 | // https://webpack.js.org/configuration/module
15 | module: {
16 | rules: [
17 | {
18 | test: /\.js$/,
19 | include: [path.resolve(__dirname, "src/js")],
20 | exclude: /node_modules/,
21 | use: {
22 | loader: "babel-loader",
23 | options: {
24 | presets: ["@babel/preset-env"],
25 | plugins: ["@babel/plugin-proposal-class-properties"],
26 | },
27 | },
28 | },
29 | ],
30 | },
31 | devtool: "source-map",
32 | // https://webpack.js.org/configuration/mode
33 | mode: "development",
34 | };
35 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Document
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/json-server-exam/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
--------------------------------------------------------------------------------
/json-server-exam/db.json:
--------------------------------------------------------------------------------
1 | {
2 | "todos": [
3 | {
4 | "id": 1,
5 | "content": "HTML",
6 | "completed": true
7 | },
8 | {
9 | "id": 2,
10 | "content": "CSS",
11 | "completed": false
12 | },
13 | {
14 | "id": 3,
15 | "content": "Javascript",
16 | "completed": true
17 | }
18 | ]
19 | }
--------------------------------------------------------------------------------
/json-server-exam/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "json-server-exam",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start" : "json-server --watch db.json",
8 | "test": "echo \"Error: no test specified\" && exit 1"
9 | },
10 | "keywords": [],
11 | "author": "",
12 | "license": "ISC",
13 | "dependencies": {
14 | "json-server": "^0.16.3"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/json-server-exam/public/delete.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
11 |
26 |
27 |
--------------------------------------------------------------------------------
/json-server-exam/public/get_All.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/json-server-exam/public/get_one.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
11 |
30 |
31 |
--------------------------------------------------------------------------------
/json-server-exam/public/patch.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
11 |
28 |
29 |
--------------------------------------------------------------------------------
/json-server-exam/public/post.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
11 |
31 |
32 |
--------------------------------------------------------------------------------
/json-server-exam/public/put.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
11 |
28 |
29 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # 자바스크립트 정리하기
2 |
3 | ```
4 | ① ELOQUENT JAVASCRIPT
5 | ② 인프런 강의(김영보)
6 | ③ 모던 자바스크립트 deep dive
7 |
8 | 를 바탕으로 만들어진 자바스크립트 스킬업 개념 정리입니다
9 |
10 | 처음에는 한 readme에 전부 작성하여 검색 (ctrl F)을 통해 모를 때마다 찾아보려 했으나,
11 |
12 | 너무 길어져서 가독성을 위해 섹션 별로 구분하였습니다.
13 |
14 | 섹션도 큰 차이는 없지만 같이 보면 좋은 방향으로 묶어두었습니다 😃
15 | ```
16 |
17 | ## 🔥 [velog에서 정리본 보기](https://velog.io/@junh0328/DEEP-DIVE-%ED%95%9C-%EC%9E%A5-%EC%9A%94%EC%95%BD-02.-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%9E%80)
18 |
19 | ## 목차
20 |
21 | ### 🔥 [섹션 1](https://github.com/junh0328/upgrade_javascript/blob/master/DEEPDIVE/readme.md)
22 |
23 | - 프로그래밍
24 | - 자바스크립트란?
25 | - 자바스크립트 개발 환경과 실행 방법
26 | - 변수
27 | - 표현식과 문
28 | - 데이터 타입
29 | - 제어문
30 | - 타입변환과 단축 평가
31 | - 객체 리터럴
32 | - 원시 값과 객체 비교
33 | - 함수
34 | - 스코프
35 | - 전역 변수의 문제점
36 | - let, const 키워드와 블록 레벨 스코프
37 |
38 | ### 🔥 [섹션 2](https://github.com/junh0328/upgrade_javascript/blob/master/DEEPDIVE/readme2.md)
39 |
40 | - 생성자 함수에 의한 객체 생성
41 | - 함수와 일급 객체
42 | - 프로토타입
43 | - strict mode
44 | - 빌트인 객체
45 | - this
46 | - 실행 컨텍스트
47 |
48 | ### 🔥 [섹션 3](https://github.com/junh0328/upgrade_javascript/blob/master/DEEPDIVE/readme3.md)
49 |
50 | - 클로저
51 | - 클래스
52 | - ES6 함수의 추가 기능
53 |
54 | ### 🔥 [섹션 4](https://github.com/junh0328/upgrade_javascript/blob/master/DEEPDIVE/readme4.md)
55 |
56 | - 배열
57 | - Number
58 | - Math
59 | - Date
60 | - RegExp
61 | - String
62 |
63 | ### 🔥 [섹션 5](https://github.com/junh0328/upgrade_javascript/blob/master/DEEPDIVE/readme5.md)
64 |
65 | - Symbol
66 | - 이터러블
67 | - 스프레드(...) 문법
68 | - 디스트럭처링 할당(구조 분해 할당)
69 |
70 | ### 🔥 [섹션 6](https://github.com/junh0328/upgrade_javascript/blob/master/DEEPDIVE/readme6.md)
71 |
72 | - 브라우저 렌더링 과정
73 | - DOM
74 | - 이벤트
75 |
76 | ### 🔥 [섹션 7](https://github.com/junh0328/upgrade_javascript/blob/master/DEEPDIVE/readme7.md)
77 |
78 | - 타이머
79 | - 비동기 프로그래밍
80 | - Ajax
81 | - REST API
82 | - Promise
83 | - 제너레이터와 async/await
84 |
85 | ### 🔥 [섹션 8](https://github.com/junh0328/upgrade_javascript/blob/master/DEEPDIVE/readme8.md)
86 |
87 | - [에러처리](https://github.com/junh0328/upgrade_javascript/blob/master/DEEPDIVE/readme8.md#47%EC%9E%A5-%EC%97%90%EB%9F%AC%EC%B2%98%EB%A6%AC)
88 | - [모듈](https://github.com/junh0328/upgrade_javascript/blob/master/DEEPDIVE/readme8.md#48%EC%9E%A5-%EB%AA%A8%EB%93%88)
89 |
--------------------------------------------------------------------------------