[DAY-1] JS ์ฃผ์ ๋ฌธ๋ฒ(1)
๐ ํท๊ฐ๋ ธ๋ & ๋ชฐ๋๋ ๋ถ๋ถ๋ค๋ง ์ ๋ฆฌํ๋ ๋๋ง์ TIL
๐ฏ ๋ชจ๋ ๊ฐ์ ๋ด์ฉ์ ์ ์ง ์์์!
โถ ์ค๋์ ์๊ฐ์?
๋๋ถ๋ถ ์๋ ๋ด์ฉ์ด์ด์ ๋ณต์ตํ๋ ์ฐจ์์์ ๋ค์๋ ๊ฒ ๊ฐ๋ค.
๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ผ์๋ก ์ค์ํ๋ค.. ๊ผญ ๊ธฐ์ตํ๊ธฐ
[1] ์น ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์๊ฒ ๋ธ๋ผ์ฐ์ ๋?
์ฐ๋ฆฌ๊ฐ ์์ฑํ ๋ก์ง์ด ๋์๊ฐ๋ ์คํ๊ธฐ๋ผ๊ณ ํ ์ ์์ต๋๋ค.
ํฌ๊ฒ ๋ธ๋ผ์ฐ์ ๋ ํต์ / ๋ ๋๋ง / ์คํฌ๋ฆฝํธ์คํ 3๊ฐ์ง๋ก ๋์ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋?
โ ๋ธ๋ผ์ฐ์ ์์ ๋์ํ๋ UI๋ฅผ ๊ฐ๋ฐํ๋ ์ฌ๋๋ค
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ ํต์ฌ ์ญ๋์
- ์ปค๋ฎค๋์ผ์ด์
- UI
- ๋คํธ์ํฌ
- ๋ณด์
- ๋ธ๋ผ์ฐ์
- ๋์์ธ
์ ์ฌ์ฏ๊ฐ๋ผ๊ณ ํ ์ ์์ต๋๋ค.
[2] ๋ณ์, ์์, ์๋ฃํ
๋ณ์ : ๋ณํ ์ ์์ด์ (var, let)
์์ : ๋ณํ ์ ์์ด์! (const)
ํ์ง๋ง var
๋ ๊ถ์ฅ๋์ง ์์ต๋๋ค! โ ์ด์ ๋? ํธ์ด์คํ
๋๋ฌธ
์๋ฃํ์๋ Number, String, Boolean, Object, Array, Function, Undefined, Null์ด ์์ต๋๋ค.
[3] JS์์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
์ผ๋ฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ ํ ๋น โ ์ฌ์ฉ โ ํด์ ์ 3๊ฐ์ง ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ๋ ํ์ ๋์ด ์์ด ๋ณ์๋ ์์๋ฅผ ์ ์ธํ๊ฒ ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์ค์ด๋ญ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ๋ณ์๋ ์์๋ฅผ ์์ฑํ๋ฉด, ๋ฉ๋ชจ๋ฆฌ์ โ์ฃผ์โ๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ฐ์ ๋จธ์ (Virtual Machine)์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
ํด๋น ๊ฐ์ ๋จธ์ ์๋ Heap ์์ญ, Call stack ์์ญ ๋ ๊ฐ์ง์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ด ์์ต๋๋ค.
Heap์ ์ฐธ์กฐ ํ์ ์ด ๋ค์ด๊ฐ๊ณ
Call Stack์ ์์ ํ์ ์ด ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
Garbage Collector๋ฅผ ํตํด ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํฉ๋๋ค.
ํ๋์ Garbage Collector๋ Mark and Sweep Algorithm
์ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
Mark and Sweep Algorithm
โ ๋ฟ์ ์ ์๋ ์ฃผ์๋ฅผ ๋๋ ํ์์๋ ์ฃผ์๋ก ์ ์ํ๊ณ ์ง์ฐ๋ ์๊ณ ๋ฆฌ์ฆ
[4] ํ๋ฆ ์ ์ด
- Control Flow
์กฐ๊ฑด์ด๋ ๋ฐ๋ณต์ ํตํด ์ํ๋ฅผ ์ ์ดํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
- ์กฐ๊ฑด๋ฌธ ํฌ์ธํธ
If์ ์์ false
๋ฟ๋ง ์๋ undefined, null, 0, NaN, โโ(empty string)
๋ ๊ฑฐ์ง์ด ๋ ์ ์์ต๋๋ค!
[5] ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด
[5-1] ๋ฐฐ์ด
๋ฐฐ์ด ์ด๊ธฐํ
- fill : ์ํ๋ ๊ฐ์ผ๋ก ๋ฐฐ์ด์ ์ฑ์ฐ๋ฉด์ ์ด๊ธฐํ
const arr = new Array(10).fill(0);
-> [0,0,0,0,0,0,0,0,0,0]
- from : ํน์ ๊ท์น์ ๊ฐ์ง ๊ฐ๋ค๋ก ๋ฐฐ์ด์ ์ฑ์์ (ํจ์ ์์ฑ)
const arr = Array.from(Array(10), function(v, k) {
return k + 1
});
-> [1,2,3,4,5,6,7,8,9,10]
๋ฐฐ์ด ๊ฐ ์ถ๊ฐ/์ญ์
- push/pop : ๋ฐฐ์ด์ ๋๋ถ๋ถ์ ๊ฐ ์ถ๊ฐ/์ญ์
- unshift/shift : ๋ฐฐ์ด์ ์๋ถ๋ถ์ ๊ฐ ์ถ๊ฐ/์ญ์
- splice(์์ idx, ๋ idx) : ๋ฐฐ์ด์ ํน์ ๋ถ๋ถ ์ญ์
๋ฐฐ์ด ๊ธฐํ ํจ์
- join : ๋ฐฐ์ด ์์๋ค ๋ฌธ์์ด๋ก ํฉ์น๊ธฐ
const arr = [1,2,3];
console.log(arr.join(","));
-> 1,2,3
- reverse : ๋ฐฐ์ด ์์ ๋ค์ง๊ธฐ
const arr = [1,2,3];
console.log(arr.reverse());
-> [3,2,1]
โ ์๋ ์กด์ฌํ๋ ๋ฐฐ์ด์ ํํ๋ reverse ํ์ ํํ๋ก ๋ฐ๋๊ฒ ๋ฉ๋๋ค.
- concat : ๋ ๋ฐฐ์ด ํฉ์น๊ธฐ
const arr = [1,2,3];
const arr2 = [4,5,6];
console.log(arr.concat(arr2));
-> [1,2,3,4,5,6]
- slice : ๋ฐฐ์ด ํน์ ๋ถ๋ถ ์๋ฅด๊ธฐ
const arr = [1,2,3,4,5];
console.log(arr.slice(2, 4)); // ์์ ์ธ๋ฑ์ค๋ ํฌํจ, ๋ ์ธ๋ฑ์ค๋ ๋ฏธํฌํจ
-> [3,4]
โ ์๋ ์กด์ฌํ๋ ๋ฐฐ์ด์ ๋ฏธ๋ฐ์ (๋ฐ์์ ์ํด์๋ splice ์ด์ฉ)
๋ฐฐ์ด ์กฐํ
for - of ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ง๊ด์
[5-2] ๊ฐ์ฒด
๊ฐ์ฒด ์ด๊ธฐํ
const obj = {};
const obj2 = new Object();
const obj3 = { key: value };
๊ฐ์ฒด ๊ฐ ์ถ๊ฐ/์ญ์
const obj = { key: "value" };
obj["key2"] = "value2";
obj.key3 = "value3";
delete obj.key2;
๊ฐ์ฒด ๊ฐ ์ /๋ฌด
const obj = { key : "value" };
console.log("key2" in obj);
-> false
ํค์ ๊ฐ
const obj = { key: "value" };
Object.keys(obj); // key ์งํฉ
Object.values(obj); // value ์งํฉ
๊ฐ์ฒด ์กฐํ
for - in ์ฌ์ฉ
[6] ์ค์ฝํ์ ํด๋ก์
[6-1] ์ค์ฝํ(=์ ํจ ๋ฒ์)
๋ณ์๊ฐ ์ด๋ ๋ฒ์๊น์ง ์ฐธ์กฐ๋๋ ์ง๋ฅผ ๋ปํฉ๋๋ค. (Global Scope, Local Scope)
var๋ ์?
ํธ์ด์คํ ๋์ด Local Scope๊ฐ Global Scope๋ก ๋ณ๊ฒฝ๋๋ ๋ฑ์ ๋ฌธ์ ๋ฐ์!
[6-2] ํด๋ก์
ํจ์๊ฐ ์ ์ธ๋ ํ๊ฒฝ์ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ์ฌ ํจ์๊ฐ ์ค์ฝํ ๋ฐ์์ ์คํ๋ ๋์๋ ๊ธฐ์ตํ ์ค์ฝํ์ ์ ๊ทผํ ์ ์๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ
- ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ด๋ถ ๋ณ์์ ํจ์๋ฅผ ์จ๊ธธ ์ ์์ต๋๋ค. (์๋ํ)
function count() {
let i=0;
for (i=0; i<5; i+=1) {
setTimeout(function() {
console.log(i);
}, i*100);
}
}
count();
-> 5 5 5 5 5
๐ ๋ต 0, 1, 2, 3, 4๋ผ๊ณ ์์ธกํ๋ ๋ ๋์..
์ฝ๋ฐฑํจ์๊ฐ ์คํ๋ ์์ ์๋ ๋ฃจํ๊ฐ ์ข ๋ฃ๋์ด
์์ i ๊ฐ์ ์ด๋ฏธ 5๊น์ง ์ฆ๊ฐํ ์ํ์ด๋ 5๊ฐ 5๋ฒ ์ถ๋ ฅ๋ฉ๋๋ค.
ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ์ฆ์ ์คํ ํจ์(IIFE) ์ฌ์ฉ
function count() {
for (var i=0; i<5; i+=1) {
(function (num) {
setTimeout(function() {
console.log(num);
}, num*100);
})(i);
}
}
count();
-> 0 1 2 3 4
์ฆ์ ์คํ ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋ฃจํ๋ง๋ค ํด๋ก์ ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- let ์ฌ์ฉ
function count() {
for (let i = 0; i < 5; i += 1) {
setTimeout(function () {
console.log(i);
}, i * 100);
}
}
count(); // 0 1 2 3 4
let์ ๋ธ๋ก ์์ค ์ค์ฝํ์ ๋๋ค.
๋ฐ๋ผ์ for๋ฌธ ๋ด์์ ์๋ก์ด ์ค์ฝํ๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ฃจํ๋ง๋ค ํด๋ก์ ๊ฐ ์์ฑ๋ฉ๋๋ค.
for๋ฌธ์ด ํ๋ฒ ๋ฐ๋ณต๋ ๋๋ง๋ค ์์์ let ๋ณ์๊ฐ ๊ณ์ ์๋ก ์์ฑ๋๋ค๊ณ ์ดํดํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค!
[7] ํธ์ด์คํ
๊ฐ๋จํ ๋งํด์ var ์ฐ๋ฉด ์ ๋๋ ์ด์ ๊ฐ ๋ฐ๋ก โํธ์ด์คํ โ์ ๋๋ค.
ํธ์ด์คํ ์ด๋, ํจ์ ์์ ์๋ ์ ์ธ๋ค์ ๋ชจ๋ ๋์ด์ฌ๋ ค์ ํด๋น ํจ์ ์ ํจ ๋ฒ์์ ์ต์๋จ์ ์ ์ธํ๋ ๊ฒ์ ๋งํฉ๋๋ค!
var๋ณ์์ ํจ์์ ์ธ๋ฌธ์์๋ง ํธ์ด์คํ ์ด ์ผ์ด๋ฉ๋๋ค.
Q. ๋ง์ฝ์ ํด๋น ํจ์ ์ ์ธ๋ฌธ์ด ์์ผ๋ฉด ์คํ์ด ๋ ๊น์?
func();
function func() {
// ํจ์์ ์ธ๋ฌธ
console.log("hello JS");
}
โ ๋ค ์คํ๋ฉ๋๋ค! ํจ์ ์ ์ธ์ด ๋งจ ์๋ก ๋์ด์ฌ๋ ค ์ง๊ธฐ ๋๋ฌธ์ด์ฃ .
์ฃผ์
[1] ์ฝ๋์ ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์๋ฅผ ์ํด ํธ์ด์คํ
์ด ์ผ์ด๋์ง ์๋๋ก ํฉ๋๋ค.
โ ์ค์ฝํ ๊ผฌ์ ํ์์ด ์ผ์ด๋๊ธฐ ์ฝ์ต๋๋ค
[2] var์ ์ฐ๋ฉด ํผ๋์ค๋ฝ๊ณ ์ธ๋ชจ์๋ ์ฝ๋๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
โ ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ var์ ํธ์ด์คํ
์ ๋ํด ๊ณต๋ถํ๋ ์ด์ ๋, ES5๋ก ํธ๋์ค์ปดํ์ผ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ด์ฃ .
ES6๋ฅผ ์ด๋์์๋ ์ธ ์ ์์ผ๋ ค๋ฉด ์์ง ์๊ฐ์ด ํ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ถ์ฒ
https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures
https://gmlwjd9405.github.io/2019/04/22/javascript-hoisting.html
๋๊ธ๋จ๊ธฐ๊ธฐ