** ๐ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์ฒด ์์ ํด๋ถ**
๐ฅ ์๋ฐ์คํฌ๋ฆฝํธ๋?
๊ตฌ๋ถ | ๋ด์ฉ |
---|---|
๐งฌ ์ธ์ด ํ์ | ์ธํฐํ๋ฆฌํฐ, ๋์ ํ์ดํ, ์ฑ๊ธ ์ค๋ ๋ |
๐ ์ญํ | ์น ๋ธ๋ผ์ฐ์ ์ ์ด, ์๋ฒ(Node.js), ์ฑ |
๐น๏ธ ์์ง | V8(Chrome), SpiderMonkey(Firefox) |
๐งฉ ํน์ง | ์ด๋ฒคํธ ๊ธฐ๋ฐ, ๋น๋๊ธฐ, ๊ฐ์ฒด ๊ธฐ๋ฐ |
๐ ์ฌํ ๋น์ :
์๋ฐ์คํฌ๋ฆฝํธ = ์๋์ฐจ์ ์กฐ์ข ์
๐ HTML: ์ฐจ์ฒด, CSS: ๋์์ธ, JavaScript: ์กฐ์ (์ด์ ๋, ํ๋ฌ)
๐ 2๏ธโฃ ๋ณ์์ ๋ฐ์ดํฐ ํ์ ์ฌํ
๐ท๏ธ ๋ณ์ ์ ์ธ
ํค์๋ | ํน์ง |
---|---|
var |
ํจ์ ์ค์ฝํ, ํธ์ด์คํ O |
let |
๋ธ๋ก ์ค์ฝํ, ํธ์ด์คํ O(์ด๊ธฐํ X) |
const |
์์, ๋ธ๋ก ์ค์ฝํ, ์ฌํ ๋น ๋ถ๊ฐ |
console.log(a); // undefined, var ํธ์ด์คํ
var a = 10;
๋ฉด์ ํฌ์ธํธ:
let
,const
๊ฐ TDZ(Temporal Dead Zone)์ ๋น ์ง๋ ์ด์ โ ์ด๊ธฐํ ์ ์ฐธ์กฐ ๊ธ์ง
๐ข ์๋ฃํ ์ฌํ
- ์์ ํ์
:
Number
,String
,Boolean
,undefined
,null
,Symbol
,BigInt
- ์ฐธ์กฐ ํ์
:
Object
,Array
,Function
๐ ์ฌํ ํฌ์ธํธ:
- Immutable(๋ถ๋ณ์ฑ): ์์ ํ์
- Mutable(๊ฐ๋ณ์ฑ): ์ฐธ์กฐ ํ์ (๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ๋ฐฉ์๊น์ง)
๐ฅ 3๏ธโฃ ์ฐ์ฐ์, ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ ์ฌํ
๐ ์ฐ์ฐ์ ์ฌํ
- == vs === โ ์๋ฌต์ ํ์ ๋ณํ ๋ฐ์ ์ฐจ์ด
&&
๋จ๋ฝ ํ๊ฐ (short-circuit) ํ์ฉ
const user = null;
const name = user && user.name; // user๊ฐ null์ด๋ฉด ํ๊ฐ ์ค๋จ
๐ฏ ์กฐ๊ฑด๋ฌธ ์ฌํ
switch
+ case fall-through ๋ฐฉ์ง- ์ผํญ ์ฐ์ฐ์ ์ค์ฒฉ (์ฃผ์: ๊ฐ๋ ์ฑ ์ ํ ์ํ)
๐ ๋ฐ๋ณต๋ฌธ ์ฌํ
๋ฐ๋ณต๋ฌธ | ํน์ฑ |
---|---|
for |
์ธ๋ฑ์ค ์ ๊ทผ |
for...in |
๊ฐ์ฒด ํ๋กํผํฐ ์ด๊ฑฐ |
for...of |
iterable ์ํ |
.forEach() |
๋ฐฐ์ด ์ํ, break ๋ถ๊ฐ |
๐งฉ 4๏ธโฃ ํจ์ ์ฌํ: ์ง์ง ํจ์ ๋ง์คํฐํ๊ธฐ
๐ก ํจ์ 4์ข ์๋ฒฝ ๋น๊ต
- ํจ์ ์ ์ธ์ โ ํธ์ด์คํ O
- ํจ์ ํํ์ โ ํธ์ด์คํ X
- ํ์ดํ ํจ์ โ
this
๋ฐ์ธ๋ฉ X - IIFE (์ฆ์ ์คํ)
๐ฅ ์ฝ๋ฐฑ, ํด๋ก์ , ๊ณ ์ฐจ ํจ์
function outer() {
let count = 0;
return function inner() {
count++;
console.log(count);
};
}
const counter = outer();
counter(); // 1
counter(); // 2
- ํด๋ก์ ์ฌํ โ ๋ฉ๋ชจ๋ฆฌ ๋์ ์ฃผ์, ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์์๊น์ง ์ฐ๊ฒฐ
๐ 5๏ธโฃ ๊ฐ์ฒด(Object)์ ํ๋กํ ํ์ ์ฌํ
๐ฆ ๊ฐ์ฒด ๋ฆฌํฐ๋ด โ ์์ฑ์ ํจ์ โ ํด๋์ค
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function() {
console.log(`Hi ${this.name}`);
};
- ํ๋กํ ํ์
์ฒด์ธ
__proto__
,prototype
์ ์ฐจ์ด ๋ช ํํ
๐ ์ฌํ:
- ์์ ๊ตฌํ:
- ES5: ํ๋กํ ํ์ ๊ธฐ๋ฐ ์์
- ES6:
class
,extends
,super
๐ 6๏ธโฃ ์ค์ฝํ, ํธ์ด์คํ , this, ํด๋ก์ ์ด๊ณ ๊ธ ์ ๋ฆฌ
๊ฐ๋ | ์ค๋ช |
---|---|
Lexical Scope | ์ ์ธ๋ ์์น ๊ธฐ์ค ์ค์ฝํ ๊ฒฐ์ |
ํธ์ด์คํ | ์ ์ธ๋ง ๋์ด์ฌ๋ฆผ, ์ด๊ธฐํ๋ X |
this | ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ ๊ฒฐ์ (๋ฉ์๋, ์์ฑ์, call/apply/bind) |
ํด๋ก์ | ์ธ๋ถ ํจ์ ๋ณ์ ๊ธฐ์ต, GC์ ์กํ์ง ์์ |
๋ฉด์ ๋จ๊ณจ ์ง๋ฌธ:
โthis๊ฐ ๊ฐ๋ฆฌํค๋ ๋์์ ์ด๋ป๊ฒ ๊ฒฐ์ ๋ ๊น?โ
โ๏ธ 7๏ธโฃ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ์ฌํ
๋ฐฉ์ | ํน์ง |
---|---|
์ฝ๋ฐฑ | ๋จ์ํ์ง๋ง Callback Hell ๋ฌธ์ |
ํ๋ก๋ฏธ์ค | then , catch , finally |
async/await | ๊ฐ๋ ์ฑ ์ข๊ณ try-catch ๊ฐ๋ฅ |
async function getData() {
try {
const res = await fetch('url');
const data = await res.json();
} catch (e) {
console.error(e);
}
}
- ์ค๋ฌด ํฌ์ธํธ:
Promise.all
,Promise.race
๋ก ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ต์ ํ ๐
๐ฑ๏ธ 8๏ธโฃ DOM ์กฐ์๊ณผ ์ด๋ฒคํธ ์ฌํ
- DOM ํธ๋ฆฌ๊ตฌ์กฐ โ ํ์ โ ์์ /์ถ๊ฐ/์ญ์
- ์ด๋ฒคํธ ๋ฒ๋ธ๋ง/์บก์ฒ๋ง, stopPropagation, preventDefault ์๋ฒฝ ์ดํด
๐ฏ ์ด๋ฒคํธ ์์ ์ค๋ฌด ์์
document.querySelector('#list').addEventListener('click', e => {
if (e.target.tagName === 'LI') {
e.target.classList.toggle('active');
}
});
๐ฆ 9๏ธโฃ ES6+ ์ฌํ (์ง์ง ์ค๋ฌด์ฉ)
๋ฌธ๋ฒ | ํ์ฉ |
---|---|
ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด | ${} ๋ก ๋ฌธ์์ด ์กฐ๋ฆฝ |
๋์คํธ๋ญ์ฒ๋ง | ๊ฐ์ฒด/๋ฐฐ์ด ๋ถํด ๋์ |
์คํ๋ ๋/Rest | ๋ฐฐ์ด/๊ฐ์ฒด ํ์ฅ, ๋งค๊ฐ๋ณ์ ๋ชจ์ |
๋ชจ๋ | import , export ๋ก ์ฝ๋ ๊ด๋ฆฌ |
๐๏ธ ๐ ์ฑ๋ฅ ์ต์ ํ, ๋๋ฒ๊น , ๋ณด์ ์ฌํ
- ๋ฉ๋ชจ๋ฆฌ ๋์ ์์ธ & ๋ฐฉ์ง
- ๋ฆฌํ๋ก์ฐ, ๋ฆฌํ์ธํธ ์ต์ํ (DOM ์กฐ์ ์ต์ ํ)
- ํฌ๋กฌ DevTools๋ก ๋๋ฒ๊น ์ฌํ
- XSS, CSRF ๋ฐฉ์ด ์ค๋ฌด ์์
๐ 11๏ธโฃ ๊ธฐ์ ๋ฉด์ & ์ค๋ฌด ์ต์ข ๋๋น
- ๐ ํด๋ก์ , ์ค์ฝํ, this, ์ด๋ฒคํธ ๋ฃจํ, ๋น๋๊ธฐ, ํ๋กํ ํ์ ์ฒด์ธ, ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ ์๋ฒฝ ๋๋น
- ์์ฃผ ๋์ค๋ ์ค์ ์ฝ๋ฉ ํ ์คํธ ๋ฌธ์ ํฌํจ
- ์๋ฐ์คํฌ๋ฆฝํธ ํธ๋ ๋: TypeScript, React/Vue ์ฐ๊ฒฐ ํฌ์ธํธ ์๊ฐ