๐ ์? (์ฌ์ฉ ์ด์ )
โผ JavaScript๋ก UI ๊ฐ์ ๊ฒ์ ๋งค์ฐ ์ฝ๊ฒ ๋ง๋ค ์ ์์ง๋ง, JavaScript ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์ด๋ ต๊ณ ๋ถํธํ ๋ฌธ๋ฒ๋ค์ด ๋ง๋ค.
โผ ES6๋ JavaScript ๋ฒ์ (2015)์ผ๋ก ๋๊ท๋ชจ ์ ๋ฐ์ดํธ๊ฐ ์งํ๋์ด, JavaScript๋ฅผ ์กฐ๊ธ ๋ ์ฝ๊ณ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋ง์ ๋ฌธ๋ฒ๋ค์ ์ง์ํด ์ค๋ค.
๐ Arrow function
<script>
// ๋ฐฉ๋ฒ 1
function test1(data) {
console.log(data);
}
// ๋ฐฉ๋ฒ 2
var test2 = (data) => {
console.log(data);
};
// ๋ฐฉ๋ฒ 2์ ๊ฐ์ ์ฝ๋
var test2 = data => console.log(data);
</script>
โผ ํจ์๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์๋ ์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
โผ function ํค์๋ ๋์ ES6์ Arrow function์ ์ฌ์ฉํด์ ๋ฐฉ๋ฒ 2์ ๊ฐ์ด ํจ์๋ฅผ ๋ง๋ค ์ ์๋ค.
โผ this ๊ฐ์ ์ฌ์ ์ ํ์ง ์์๋ ๋ ๋, ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
โ Arrow fucntion์ ์ฅ์
โผ ํจ์๋ฅผ ๋ง๋ค ๋ ๊ฐ๋ ์ฑ์ด ํฅ์๋๋ค.
โผ ํ๋ผ๋ฏธํฐ๊ฐ 1๊ฐ ์์ ๋, ์๊ดํธ๋ฅผ ์ญ์ ํ ์ ์๋ค.
โผ ์ฝ๋๊ฐ ํ ์ค์ด๋ฉด {}๋ฅผ ์๋ตํ ์ ์๋ค.
๐ ๋ณ์
โผ ์ฌ์ฉํ ์ ์๋ ๋ณ์ ํค์๋๋ var, let, const๊ฐ ์กด์ฌํ๋ค.
โผ ์ ์ธ, ํ ๋น, ๋ฒ์, ํธ์ด์คํ 4๊ฐ์ง๋ฅผ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ข๋ค.
โผ ํธ์ด์คํ ์ var ํค์๋์ ํจ์์์ ๋ฐ์ํ๋ค.
โ var ํค์๋
// ์ฌ์ ์ธ
var a = 1;
var a = 1; // ๊ฐ๋ฅ
// ์ฌํ ๋น
a = 3; // ๊ฐ๋ฅ
// ๋ฒ์
function asc() {
var b = 1;
}
console.log(b); // ์๋ฌ ๋ฐ์
if (true) {
var c = 1;
}
console.log(c); // 1
// ํธ์ด์คํ
console.log(d); // undefined
var d = 1;
โผ ์ฌ์ ์ธ์ด ๊ฐ๋ฅํ๋ค.
โผ ์ฌํ ๋น์ด ๊ฐ๋ฅํ๋ค.
โผ ๋ฒ์(์ค์ฝํ)๋ function์ด๋ค.
โผ ํธ์ด์คํ ์ด ๋ฐ์ํ๋ค.
โ ํธ์ด์คํ ์ด๋, ์ ์ธ๋ถ๋ฅผ ์๋ก ๋์ด์ฌ๋ฆฌ๋ ๊ฒ์ ์๋ฏธํ๋ค. * ํ ๋น์ ์ด๋ฃจ์ด์ง์ง ์๋๋ค.
๐ฅ ํธ์ด์คํ ์ผ๋ก ์ธํด ์ ์ฝ๋์ d ๋ณ์ ๋ถ๋ถ์ด ๋ค์๊ณผ ๊ฐ์์ง๋ค.
var d;
console.log(d);
d = 1;
โ let ํค์๋
// ์ฌ์ ์ธ
let a = 1;
let a = 1; // ๋ถ๊ฐ๋ฅ
// ์ฌํ ๋น
a = 3; // ๊ฐ๋ฅ
// ๋ฒ์
function asc() {
let b = 1;
}
console.log(b); // ์๋ฌ ๋ฐ์
if (true) {
let c = 1;
}
console.log(c); // ์๋ฌ ๋ฐ์
// ํธ์ด์คํ
console.log(d); // ์๋ฌ ๋ฐ์
var d = 1;
โผ ์ฌ์ ์ธ์ด ๋ถ๊ฐ๋ฅํ๋ค.
โผ ์ฌํ ๋น์ด ๊ฐ๋ฅํ๋ค.
โผ ๋ฒ์(์ค์ฝํ)๋ block์ด๋ค.
โผ ํธ์ด์คํ ์ด ๋ฐ์ํ์ง ์๋๋ค.
โ const ํค์๋
// ์ฌ์ ์ธ
const a = 1;
const a = 1; // ๋ถ๊ฐ๋ฅ
// ์ฌํ ๋น
a = 3; // ๋ถ๊ฐ๋ฅ
// ๋ฒ์
function asc() {
let b = 1;
}
console.log(b); // ์๋ฌ ๋ฐ์
if (true) {
let c = 1;
}
console.log(c); // ์๋ฌ ๋ฐ์
// ํธ์ด์คํ
console.log(d); // ์๋ฌ ๋ฐ์
var d = 1;
โผ ์ฌ์ ์ธ์ด ๋ถ๊ฐ๋ฅํ๋ค.
โผ ์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅํ๋ค.
โผ ๋ฒ์(์ค์ฝํ)๋ block์ด๋ค.
โผ ํธ์ด์คํ ์ด ๋ฐ์ํ์ง ์๋๋ค.
const arr = [1, 2, 3];
const obj = {
name: "choi",
};
arr[3] = 4; // ๊ฐ๋ฅ
obj.age = 10; // ๊ฐ๋ฅ
console.log(arr);
console.log(obj);
โผ Object, Array์์๋ ์์ ์ด ๊ฐ๋ฅํ๋ค.
const arr = [1, 2, 3];
const obj = {
name: "choi",
};
Array.freeze(arr);
Object.freeze(obj);
arr[3] = 4; // ๋ถ๊ฐ๋ฅ
obj.age = 10; // ๋ถ๊ฐ๋ฅ
โผ ์์ ์ด ๋ถ๊ฐ๋ฅํ Object, Array๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ Object.freeze({Object ๋ช }), Array.freeze({Array ๋ช })์ ์ฌ์ฉํ์ฌ ์์ ์ด ๋ถ๊ฐ๋ฅํ๊ฒ ํ ์ ์๋ค.
โผ strict ๋ชจ๋์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๐ฌ JavaScript์์ ์ ์ญ ๋ณ์ ๋ง๋ค๊ธฐ
// ๋ฐฉ๋ฒ 1
<script>
var a = 1; // ์ ์ญ ๋ณ์
let b = 2; // ์ ์ญ ๋ณ์
const c = 3; // ์ ์ญ ๋ณ์
console.log(window.a); // 1
console.log(window.b); // undefined
console.log(window.c); // undefined
</script>
// ๋ฐฉ๋ฒ 2
<script>
window.a = 1; // ์ ์ญ ๋ณ์
window.b = 2; // ์ ์ญ ๋ณ์
window.c = 3; // ์ ์ญ ๋ณ์
</script>
โผ ์์ ๊ฐ์ด JavaScript์์ ์ ์ญ ๋ณ์๋ฅผ ์ ์ธ ๋ฐ ์ด๊ธฐํํ ์ ์๋ค.
๐ฅ ๋จ, 1๋ฒ ๋ฐฉ๋ฒ์์ var a๋ window.a๋ก ํ ๋น๋์ง๋ง, let๊ณผ const๋ window.b, window.c๋ก ํ ๋น๋์ง ์๋๋ค.
// ์๋ฌ ๋ฐ์
<script>
function test() {
var a = 10;
}
test();
console.log(a); // ์๋ฌ ๋ฐ์
</script>
// ์ ์ ์ถ๋ ฅ
<script>
function test() {
window.a = 10;
}
test();
console.log(a); // 10
</script>
โผ ์์ ๊ฐ์ ์ฝ๋ ํ์ ๋๋ฌธ์, ์ ์ญ ๋ณ์ ์ ์ธ ๋ฐ ์ด๊ธฐํ ์, window.{์ ์ญ ๋ณ์ ๋ช } ๋ฐฉ์์ ๊ถ์ฅํ๋ค.
๐ฅ ์กฐ์ฌํด์ผ ํ ์ํฉ
<script>
for (var i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
</script>
โผ ์ ์ฝ๋์ ๊ฒฐ๊ณผ๋ก 1์ด ํ์, 1๋ถํฐ 10๊น์ง ์ถ๋ ฅ๋๊ธธ ์ํ์ง๋ง ์ค์ ์ถ๋ ฅ ๊ฐ์ 10์ด 10๋ฒ ์ถ๋ ฅ๋๋ค.
โผ ์ค์ ๋ก console.log()๊ฐ ์คํ๋๋ ์์ ์ 1์ด ํ์ด๊ณ , var ํค์๋๋ก ์ ์ธ๋ i๋ function ์ค์ฝํ๋ก ์ฌ์ฉ๋๋ฏ๋ก, 1์ด ํ์๋ ๋ชจ๋ for๋ฌธ ๋์ i ๊ฐ์ด 10์ผ๋ก ๋ณ๊ฒฝ๋ ์ํ๋ก console.log()๊ฐ ์คํ๋๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
โผ for ๋ฌธ์์๋ var ํค์๋๋ก i๋ฅผ ์ ์ธํ๋ ๊ฒ์ด ์๋ let ํค์๋๋ก ์ ์ธํด์ block ๋ฒ์๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๐ template literals (strings)
โผ ES6 ๋ฒ์ ๋ถํฐ ์ง์ํ๋ ๋ฌธ์์ด์ ๋ค๋ฅด๊ฒ ์ ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
โผ `(๋ฐฑํฑ)์ ์ฌ์ฉํด์ ๋ฌธ์์ด์ ์์ฑํ ์ ์๋ค.
โ ์ฅ์
// ์ํฐํค
let a = `Hello
Enter`;
console.log(a); // Hello
// Enter
// ๋ณ์ ๋ฃ๊ธฐ
let age = 10;
console.log(`choi์ ๋์ด๋ ${age}์ด์ด๋ค.`); // choi์ ๋์ด๋ 10์ด์ด๋ค.
// ํจ์ ๋ฃ๊ธฐ
let age = function () {
return 10;
};
console.log(`choi์ ๋์ด๋ ${age()}์ด๋ค.`); // choi์ ๋์ด๋ 10์ด์ด๋ค.
// ํด์ฒดํ๊ธฐ
let name = "choi";
let age = 10;
function separator(strs, var1, var2) {
console.log(strs); // ["์๋
ํ์ธ์ ์ ๋ ", "์ด๋ฉฐ, ", "์ด์
๋๋ค."]
console.log(var1); // choi
console.log(var2); // 10
}
separator`์๋
ํ์ธ์ ์ ๋ ${name}์ด๋ฉฐ, ${age}์ด์
๋๋ค.`;
โผ ์ํฐํค๋ฅผ ์ฌ์ฉํด์ ์ํฐ๊ฐ ์ ์ฉ๋ ๋ฌธ์์ด์ ์์ฑํ ์ ์๋ค.
โผ ${}๋ฅผ ์ฌ์ฉํ์ฌ, ๋ฌธ์์ด ์ค๊ฐ์ ๋ณ์, ํจ์๋ฅผ ์ฝ๊ฒ ๋ฃ์ ์ ์๋ค.
โผ ``์ ์ฌ์ฉํ์ฌ ๋ง๋ค์ด์ง ๋ฌธ์์ด์ ๋ณ์ ๊ธฐ์ค์ผ๋ก ํด์ฒดํด์ ์ํ๋ ๋ฌธ์์ด๋ก ์ฌ์กฐ๋ฆฝํ๊ธฐ ์ฝ๋ค.
๐ Spread Operator
โผ ...(Spread Operator)์ ์ฌ์ฉํด์ ํผ์ณ์ ๋์ฌ ํธ๋ฆด ์ ์๋ค.
โผ ๋ณ์ ์ผ์ชฝ์ ๋ถ์ฌ ์ฌ์ฉํ๋ค.
โผ ํญ์ ์๊ดํธ( () ), ์ค๊ดํธ( {} ), ๋๊ดํธ( [] ) ์์์ ์ฌ์ฉํด์ผ ํ๋ค.
โ ์ฌ์ฉ๋ฒ
// ๋ณ์ ๋์ฌ ํธ๋ฆฌ๊ธฐ
var arr = ["Hello", "World!"];
console.log(...arr); // Hello World!
var str = "Hello";
console.log(...str); // H e l l o
โผ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ฉด ์์ ๊ธฐ์ค์ผ๋ก ๊ณต๋ฐฑ์ด ๋ถ๊ณ , ํฉ์ณ์ง๋ค.
// Array, Object ํฉ์น๊ธฐ
var arr1 = [1, 2, 3];
var arr2 = [4, 5];
var arr3 = [...arr1, ...arr2];
console.log(arr3); // [1, 2, 3, 4, 5]
var o1 = { a: 1, b: 2 };
var o2 = { ...o1, c: 3 };
console.log(o2); // {a: 1, b: 2, c: 3}
โผ ๋ฌธ์์ด๋ Array ์ฒ๋ผ ์ธ๋ฑ์ฑ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๋ฉด, ๋ฌธ์๋ค๋ก ๋๋๋ค.
// Deep Copy
var arr1 = [1, 2, 3];
var arr2 = arr1; // shallow copy
var arr2 = [...arr1] // deep copy
var o1 = { a: 1, b: 2 };
var o2 = { ...o1 };
console.log(o2); // {a: 1, b: 2}
โผ Array, Object์ ํฉ์น๊ฑฐ๋, Deep Copy์์ ์ ๋ฆฌํ๋ค.
๐ฅ ๋จ, Object์ Deep Copy์์ o1๊ฐ {a: 1} ์ผ ๋, o2 = {a: 3, ...o1}๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ฉด, o2 = {a: 1}์ด ๋๋ค. ๋ค์ ์ค๋ ๊ฒ์ผ๋ก ๋ฎ์ด ์์์ง๋ค.
// ์ธ์๋ก ๋๊ธฐ๊ธฐ
var arr1 = [1, 2, 3];
function test(a, b, c) {
console.log(a + b + c);
}
test(...arr1);
โผ Array๋ฅผ ์ธ์๋ก ๋๊ธธ ๋ Spread Operator๋ฅผ ์ฌ์ฉํ๋ฉด, ์์ ํ๋์ฉ ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค.
โผ Object์์๋ ์ฌ์ฉํ ์ ์๋ค.
๐ ES6 ํจ์์ ์ถ๊ฐ๋ ๊ธฐ๋ฅ
โ dafult parameter
// ๊ฐ
function add(a, b = 10) {
console.log(a + b);
}
add(1); // 11
// ์
function add(a, b = 10 + 5) {
console.log(a + b);
}
add(1); // 16
// ๋ณ์
function add(a, b = 10 + a) {
console.log(a + b);
}
add(1); // 12
// ํจ์
function defaultValue() {
return 10;
}
function add(a, b = defaultValue()) {
console.log(a + b);
}
add(1); // 11
// ํ๋ผ๋ฏธํฐ 2๊ฐ ๋์ด์์ ๋
function add(a, b = 10) {
console.log(a + b);
}
add(1, 4); // 5
โผ ๊ธฐ์กด JavaScript์์๋ ํ๋ผ๋ฏธํฐ๋ฅผ 2๊ฐ ๋ฐ๋ ํจ์์์ 1๊ฐ์ ํ๋ผ๋ฏธํฐ๋ง ๋์ด์๋ ์ ์ ์คํ๋์๋ค.
โผ ES6 ์ดํ ๋ถํฐ๋ default ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด์ ํ๋ผ๋ฏธํฐ์ ์ด๊ธฐ ๊ฐ์ ์ค์ ํ ์ ์๋ค.
โผ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์์ ์ผ๋ก 2๊ฐ ๋๊ฒผ์ ๋๋ default parameter์ ๊ฐ์ด ์ ์ฉ๋์ง ์๋๋ค.
โ ํจ์์ arguments
function printParameters(a, b, c) {
console.log(arguments[0]); // 1
console.log(arguments[1]); // 2
console.log(arguments[2]); // 3
}
printParameters(1, 2, 3);
โผ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐฐ์ด์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
function printParameters(a, b, c) {
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
printParameters(1, 2, 3);
โผ ์์ ๊ฐ์ด ์กฐ๊ธ ํ์ฅ์ฑ ์๊ฒ ์ฌ์ฉํ ์ ์๋ค.
โ rest parameter
function print(...arr) {
for (let i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
}
print(1, 2, 3);
function print(a, b, ...arr) {
console.log(a); // 1
console.log(b); // 2
for (let i = 0; i < arr.length; i++) {
console.log(arr[i]); // 3 // 4 // 5
}
}
print(1, 2, 3, 4, 5);
โผ ํจ์์ ํ๋ผ๋ฏธํฐ ์๋ฆฌ์ ...์ด ๋ถ์ผ๋ฉด rest parameter์ด๋ค.
โผ ์ธ์๋ก ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ๋ฐ๋ก ๋๊ธธ ๋, rest parameter๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ผ๋ฉด ๊ฐ ๊ฐ๋ค์ด Array ์์๋ก ์ ์ฅ๋์ด ์ฌ์ฉํ ์ ์๋ค.
โผ ์ธ์๋ก ๋ช ๊ฐ์ ๊ฐ์ด ๋์ด์ฌ์ง ๋ชจ๋ฅผ ๋, ์ฌ์ฉํ๋ฉด ์ข๊ณ ํจ์์ arguments๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์ข๋ค.
๐ฅ rest parameter๋ ํ๋ผ๋ฏธํฐ ๋ง์ง๋ง์ ์ฌ์ฉํ์ง ์๊ณ , ๋ ๋ฒ ์ด์ ์ฌ์ฉํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
๐ Data Type
โ primitive data type
"abc"
10
true
undefined
null
โผ ์ข ๋ฅ๋ number, string, boolean, null, undefined๊ฐ ์๋ค.
โผ primitive data type์ ๋ณ์์ ๊ฐ์ด ๊ทธ๋๋ก ์ ์ฅ๋๋ค.
โ reference data type
[1, 2, 3]
{name: "choi"}
โผ ์ข ๋ฅ๋ array, object๊ฐ ์๋ค.
โผ reference data type์ ๋ณ์์ ๊ฐ์ด ์กด์ฌํ๋ ๊ฒ์ด ์๋ ์ฐธ์กฐ ์ฃผ์ ๊ฐ์ด ์กด์ฌํ๋ค.
๐ฅ ๊ณ ๋ ค ์ฌํญ
// primitive data type
let a = 10;
let b = a;
b = 20;
console.log(a) // 10
// reference data type
let obj1 = {age: 10};
let obj2 = obj1;
obj2.age = 20;
console.log(obj1.age) // 20
โผ primitive data type์ b = a;์์ a์ ๋ฐ์ดํฐ ๊ฐ์ด ๋ณต์ฌ๋์ด b์ ์ ์ฅ๋๋ค. ๋ฐ๋ผ์, b์ ๊ฐ์ ๋ณ๊ฒฝํด๋ a์ ๊ฐ์ ๋ณํจ์์ด 10์ด ์ถ๋ ฅ๋๋ค.
โผ reference data type์ obj2 = obj1;์์ obj1์ ์ฐธ์กฐ ์ฃผ์ ๊ฐ์ด ๋ณต์ฌ๋์ด obj2์ ์ ์ฅ๋๋ค. ๋ฐ๋ผ์, obj1์ obj2๋ ๊ฐ์ ์ฐธ์กฐ ๊ณต๊ฐ์ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์, obj2์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด obj1์ ๊ฐ๋ ๋ณ๊ฒฝ๋์ด 20์ด ์ถ๋ ฅ๋๋ค.
// ์ํฉ 1
var obj1 = {name: "choi"}
function change(obj) {
obj = {name: "kim"};
}
change(obj1);
console.log(obj1.name) // choi
// ์ํฉ 2
var obj1 = {name: "choi"}
function change(obj) {
obj.name = "kim";
}
console.log(obj1.name) // kim
โผ ์ํฉ 1) JavaScript๋ Call By Value์ด๊ธฐ ๋๋ฌธ์, ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ์ฐธ์กฐ ์ฃผ์ ๊ฐ์ obj๋ผ๋ ์๋ก์ด ๋ณ์์ ๋ณต์ฌํด์ ํ ๋นํ๋ค. ์ดํ, obj์ ๋ค๋ฅธ Object๋ฅผ ๋์ ํ์๊ธฐ ๋๋ฌธ์, obj์ obj1์ ๋ค๋ฅธ ์ฐธ์กฐ ์ฃผ์ ๊ฐ์ ๊ฐ์ง๊ฒ ๋์ด change ํจ์ ํ obj1.name ๊ฐ์ ์ถ๋ ฅํ๋ฉด "choi"๊ฐ ์ถ๋ ฅ๋๋ค.
โผ ์ํฉ 2) ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ์ฐธ์กฐ ์ฃผ์ ๊ฐ์ obj๋ผ๋ ์๋ก์ด ๋ณ์์ ๋ณต์ฌํด์ ํ ๋นํ๋ค. obj.name = "kim"์ด ๋์ํ ๋, obj์๋ obj1์ ์ฐธ์กฐ ์ฃผ์ ๊ฐ์ด ๋ณต์ฌ๋์ด ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์, obj1๊ณผ ๊ฐ์ ์ค์ ๊ฐ์ name์ "kim"์ผ๋ก ๋ฐ๊พผ๋ค. chage ํจ์ ํธ์ถ ํ obj1.name์ ์ถ๋ ฅํ๋ฉด "kim"์ด ์ถ๋ ฅ๋๋ค.
๐ Symbol
let person = { name: "choi" };
let age = Symbol("๋์ด");
person[age] = 10;
console.log(person); // {name: 'choi', Symbol(๋์ด): 10}
console.log(person.age); // undefined
console.log(person[age]); // 10
for (let key in person) {
console.log(key); // name๋ง ์ถ๋ ฅ๋๋ค.
}
โผ ์ค์ฉ์ ์ธ ์๋ฃํ์ ์๋๋ค.
โผ Symbol์ ์ฉ๋๋ Object ์๋ฃํ์ ๋น๋ฐ์ค๋ฌ์ด key ๊ฐ์ด๋ค. (๋น๊ณต๊ฐ)
โผ Object key ๊ฐ์ผ๋ก Symbol์ ๋ฃ์ ์ ์๋ค.
โผ person.age๋ฅผ ์ฌ์ฉํ๋ฉด 10์ด๋ผ๋ ๊ฐ์ด ์๋, undefined๊ฐ ์ถ๋ ฅ๋๋ค.
โผ symbol์ ์ฌ์ฉํด์ ๊ฐ์ ๋ฃ์ผ๋ฉด ,enumerableํ์ง ์๋ค. ๋ฐ๋ผ์, person์ ๋ํด์ for ๋ฌธ์ ์คํํ๋ฉด, name์ด๋ผ๋ key ๊ฐ๋ง ์ถ๋ ฅ๋๋ค.
๐ Map & Set
โ Map
let map = new Map();
map.set("name", "choi");
map.set(100, "age");
console.log(map); // Map(2) {'name' => 'choi', 100 => 'age'}
console.log(map.get("name")); // choi
โผ key, value๋ฅผ ์ ์ฅํ๋ Map ์๋ฃํ
โผ Map ์๋ฃํ์ ์๋ฃ ๊ฐ์ ์ฐ๊ด์ฑ/์์กด์ฑ์ ํํํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์, "name" => "choi" ๊ฐ์ ํํ๋ก ์ ์ฅ๋์ด ์๋ค.
โผ Object ์๋ฃํ์์ key ๊ฐ์ ๋ฌธ์์ด๋ง ๊ฐ๋ฅํ์ง๋ง, Map์ ๋ชจ๋ ์๋ฃํ์ด ๊ฐ๋ฅํ๋ค.
โ Set
let set = new Set(["a", "a"]);
set.add("a");
console.log(set); // Set(1) {'a'}
console.log(set.has("a")); // true
console.log(set.size); // 1
โผ ์ค๋ณต ์๋ฃ๋ฅผ ํ์ฉํ์ง ์๋ Array์ ๋น์ทํ ์๋ฃํ
๐ ?. & ??
โ ?. (optional chaining)
let user = {
name: "choi",
};
console.log(user.age.value); // Reference Error
console.log(user.age?.value); // undefined
โผ ?. ์ผ์ชฝ์ด null ์ด๊ฑฐ๋ undefined๋ฉด ์ค๋ฅธ์ชฝ์ ์คํํ์ง ์๊ณ undefined๋ฅผ ์ถ๋ ฅํ๋ค.
โผ ์ค์ฒฉ Object์ผ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค. ์ฆ, ํ ์ฝ๋์ .์ด 2๋ฒ ์ด์ ์์ ๊ฒฝ์ฐ 2๋ฒ ์งธ .๋ถํฐ ์ฌ์ฉํ๋ค.
โ ?? (nullish coalescing)
let user = {
name: "choi",
};
console.log(user.age ?? 10); // 10
โผ ?? ์ผ์ชฝ์ด null์ด๊ฑฐ๋ undefined๋ฉด ์ค๋ฅธ์ชฝ์ ์คํํ๋ค.
๐ ๊ฐ์ฒด ์งํฅ
๐ฌ ๊ฐ์ฒด ์งํฅ ๋ฌธ๋ฒ์Object๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด์ ์ฌ์ฉํ ๋, ์กฐ๊ธ ๋ ํธ๋ฆฌํ๊ฒ ๋ง๋ค๊ณ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
๐ฅ ES6 ๋ฌธ๋ฒ ์ด์
โ constructor
function Person(name, age) {
this.name = name;
this.age = age;
this.say = function () {
console.log(`๋ด ์ด๋ฆ์ ${this.name} ์ด๊ณ , ๋์ด๋ ${this.age} ์
๋๋ค.`);
};
}
let person1 = new Person("choi1", 10);
let person2 = new Person("choi2", 20);
let person3 = new Person("choi3", 30);
person1.say(); // ๋ด ์ด๋ฆ์ choi1 ์ด๊ณ , ๋์ด๋ 10 ์
๋๋ค.
person2.say(); // ๋ด ์ด๋ฆ์ choi2 ์ด๊ณ , ๋์ด๋ 20 ์
๋๋ค.
person3.say(); // ๋ด ์ด๋ฆ์ choi3 ์ด๊ณ , ๋์ด๋ 30 ์
๋๋ค.
โผ constructor๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋, ์ฌ์ฉํ๋ค.
โผ ์ฌ๊ธฐ์ this๋ ์๋ก์ด Object๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
โผ ์๋ฐ์ฒ๋ผ Class๋ฅผ ์ ์ํ๊ณ ์์ฑ์(constructor)๋ฅผ ์ฌ์ฉํด์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด ์๋, ์์ฑ์๋ง ๊ฐ์ง๊ณ Object(์ธ์คํด์ค)๋ฅผ ์์ฑํ ์ ์๋ค.
โ prototype
function Person(name) {
this.name = name;
this.age = 10;
this.say = function () {
console.log(`๋ด ์ด๋ฆ์ ${this.name} ์ด๊ณ , ๋์ด๋ ${this.age} ์
๋๋ค.`);
};
}
console.log(Person.prototype);
โผ prototype์ ์์์ ๊ตฌํํ ์ ์๋ JavaScript์ ๋ฌธ๋ฒ์ด๋ค.
โผ constructor๋ฅผ ๋ง๋ค๋ฉด prototype์ด๋ผ๋ ๊ณต๊ฐ์ด ์๋์ผ๋ก ์๊ธด๋ค.
โผ Person์ด๋ผ๋ constructor๋ฅผ ์์ฑํ ๋ค, prototype์ ์ถ๋ ฅํ๋ฉด ํน์ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
โผ prototype์ด๋ผ๋ ๊ณต๊ฐ์ ๊ฐ์ ์ถ๊ฐํ๋ฉด, ๋ชจ๋ ์์๋ค์ด ๋ฌผ๋ ค๋ฐ์ ์ ์๋ค.
โผ prototype์ ํจ์์๋ง ์์ฑ๋๋ ๊ณต๊ฐ์ด๋ค.
function Person(name, age) {
this.name = name;
this.age = age;
this.say = function () {
console.log(`๋ด ์ด๋ฆ์ ${this.name} ์ด๊ณ , ๋์ด๋ ${this.age} ์
๋๋ค.`);
};
}
let person1 = new Person("choi", 10);
let person2 = new Person("choi2", 20);
console.log(person1.country);
console.log(person2.country);
Person.prototype.country = "ko";
console.log(person1.country);
console.log(person2.country);
โผ ์ ์์ ์ ๊ฐ์ด, new Person()์ผ๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ค, ์ถํ new Person() ์์ฑํ ๋ชจ๋ ์ธ์คํด์ค์ ๊ฐ์ ์ถ๊ฐํด์ผ ํ ๊ฒฝ์ฐ, ์ ์ฉํ๋ค.
๐ฌ ์ด๋ฌํ ๋ฐฉ๋ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋, person1.country ์ฝ๋์ ๊ฒฝ์ฐ JavaScript๋ person1์ด ์ง์ name์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํ๊ณ ์์ผ๋ฉด prototype ๊ณต๊ฐ์ ํ์ธํด์ ๊ฐ์ด ์กด์ฌํ๋ฉด ์ถ๋ ฅํ๋ค. person1.toString() ๊ฐ์ ๊ฒฝ์ฐ์๋ Person ๊ฐ์ฒด์ ๊ฐ๋ ์๊ณ , prototype์๋ ์์ด, ๊ทธ ์์์ธ Object.prototype์ ์กด์ฌํ๋ toString()์ ์คํํด ์ค๋ค.
๐ฅ ES6 ๋ฌธ๋ฒ ์ดํ
โ class
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
this.say = function () { // 1๋ฒ
console.log(`1. ๋ด ์ด๋ฆ์ ${this.name} ์ด๊ณ , ๋์ด๋ ${this.age} ์
๋๋ค.`);
};
}
say() { // 2๋ฒ
console.log(`2. ๋ด ์ด๋ฆ์ ${this.name} ์ด๊ณ , ๋์ด๋ ${this.age} ์
๋๋ค.`);
}
}
let person1 = new Person("choi", 10);
console.log(person1.name); // choi
person1.say(); // 1. ๋ด ์ด๋ฆ์ ${this.name} ์ด๊ณ , ๋์ด๋ ${this.age} ์
๋๋ค.
โผ Class๋ฅผ ์ฌ์ฉํด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค.
โผ 1๋ฒ์ผ๋ก ํจ์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ๊ณผ 2๋ฒ์ผ๋ก ํจ์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
โ 1๋ฒ์ผ๋ก ํจ์๋ฅผ ์์ฑํ๋ฉด, Person์ด๋ผ๋ Object์ ํฌํจ๋ ํจ์๋ก์จ ์๋ํ๋ค. ์ฆ, ์์ฑ๋ ์ธ์คํด์ค๊ฐ ์ค์ ๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ค.
โ 2๋ฒ์ผ๋ก ํจ์๋ฅผ ์์ฑํ๋ฉด, Person์ prototype ๊ณต๊ฐ์ ํฌํจ๋ ํจ์๋ก์จ ์๋ํ๋ค. ์ฆ, ์ธ์คํด์ค๊ฐ ์ค์ ๊ฐ์ผ๋ก ๊ฐ์ง๋ ๊ฒ์ด ์๋ Person ํด๋์ค์ prototype ๊ณต๊ฐ์์ ๊ฐ์ง๊ณ ์๋ค.
โผ ๋ฐ๋ผ์, person1.say() ์ฝ๋๋ฅผ ์คํํ๋ฉด, Object์ ์ค์ ๊ฐ๋ถํฐ ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์ 1๋ฒ ํจ์์ ์คํ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ค.
โ extends
class Dog {
constructor(type, characteristic) {
this.type = type;
this.characteristic = characteristic;
this.burk = function () {
console.log("Bow-wow!!");
};
}
print() {
console.log("print");
}
}
class Bulldog extends Dog {
constructor(something) {
super("Bulldog", "strong");
this.something = something;
}
}
class Poodle extends Dog {
constructor() {
super("Poodle", "cute");
}
print() {
console.log("i`m poodle");
}
}
let bulldog = new Bulldog("something");
console.log(bulldog.type); // Bulldog
console.log(bulldog.something); // something
bulldog.burk(); // Bow-wow!!
bulldog.print(); // print
let poodle = new Poodle();
console.log(poodle.type); // Poodle
poodle.burk(); // Bow-wow!!
poodle.print(); // i`m poodle
โผ class ์์์ ์ํด์ ์ฌ์ฉํ๋ค.
โผ class์ ๊ฐ์ด๋ ํจ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด์, ๋ณ๋์ ์ถ๊ฐ์ ์ธ class ์ฌ๋ฌ ๊ฐ๊ฐ ์ถ๊ฐ๋์ด์ผ ํ ๋, ์์์ด๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํ๋ค.
โผ extends ํด์ ๋ง๋ class๋ constructor ๋ด๋ถ์์ super ํจ์๋ฅผ ํตํด ๋ถ๋ชจ ๊ฐ์ฒด์ constructor๋ ํธ์ถํด ์ฃผ์ด์ผ ํ๋ค.
โผ print ํจ์์ ๊ฒฝ์ฐ, Dog ํด๋์ค์ prototype ๊ณต๊ฐ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์, bulldog ๋ณ์์์ print ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด Dog์ print๊ฐ ํธ์ถ๋์ง๋ง, poodle์ ๊ฒฝ์ฐ print ํจ์๋ฅผ ์ฌ์ ์ ํ์๊ธฐ ๋๋ฌธ์, "i`m poodle"์ด ์ถ๋ ฅ๋๋ค. Java์ IOverride๋ ๋์ผํ๋ค.
๐ Destructuring
โ Array, Object -> ๋ณ์
let arr = [1, 2, 3];
// ๊ธฐ์กด
let a = arr[0];
let b = arr[1];
let c = arr[2];
// destructing (Array)
let [a, b, c] = arr;
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3
// destructing (Object)
let obj = { name: "choi", age: 10 };
let { name, age } = obj;
console.log(name);
console.log(age);
โผ ๋ชจ์( [] ) ๋ง์ถฐ์ ๋ณ์๋ฅผ ์ ์ธํ๊ณ Array๋ฅผ ๋์ ํ๋ฉด, ๊ฐ ๋ณ์์ ์์์ ๋ง๋ Array ์ธ๋ฑ์ค ๊ฐ์ด ํ ๋น๋๋ค.
โผ ๋ชจ์( {} ) ๋ง์ถฐ์ key ๊ฐ์ ๋ณ์ ์ด๋ฆ์ผ๋ก ์ ์ธํ๊ณ Object๋ฅผ ๋์ ํ๋ฉด, ๊ฐ ๋ณ์์ ๋ง๋ Object value ๊ฐ์ด ํ ๋น๋๋ค.
โ default ๊ฐ ์ง์
// Array
let arr = [1, 2];
let [a, b, c = 3, d] = arr;
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3
console.log(d); // undefined
// Object
let obj = { name: "choi", age: 10 };
let { name, age, type = "person", something } = obj;
console.log(name);
console.log(age);
console.log(type);
console.log(something);
โผ default ๊ฐ๋ ์ง์ ํ ์ ์๋ค.
โผ default ๊ฐ๋ ์์ ๊ฒฝ์ฐ์๋ undefined๊ฐ ์ถ๋ ฅ๋๋ค.
โ ๋ณ์ -> Object
let name = "choi";
let age = 10;
let person = { name, age };
console.log(person.name); // choi
console.log(person.age); // 10
โผ ๋ฐ๋๋ก Object๋ฅผ ์์ฑํ ๋, ๋ณ์ ์์ฒด๋ฅผ ๋ฃ์ ๊ฒฝ์ฐ, ๋ณ์์ ์ด๋ฆ์ด key ๊ฐ, ๋ณ์์ ๊ฐ์ด value ๊ฐ์ผ๋ก ์ ์ฅ๋๋ค.
โ ํจ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๊ธฐ
// Array
let arr = [1, 2, 3];
function print([a, b, c]) {
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3
}
print(arr);
// Object
let person = { name: "choi", age: 10 };
function print({ name, age }) {
console.log(name); // choi
console.log(age); // 10
}
print(person);
โผ { }๋ฅผ ์ฌ์ฉํ์ฌ Object์ key ๊ฐ์ value ๊ฐ์ ๋ณ์๋ก ๋ฐ์ ์ ์๋ค.
๐ import & export
โ preview.js ํ์ผ์ preview.html ํ์ผ์์ ์ฌ์ฉํ๊ธฐ
// ๊ธฐ์กด
<script src="preview.js"></script>
// import & export
/* preview.html ํ์ผ */
<script type="module">
import a from "/preview.js";
console.log(a); // 10
</script>
<script type="module">
import exportVal from "/preview.js";
console.log(exportVal); // 10
</script>
/* preview.js ํ์ผ */
let a = 10;
export default a;
โผ import { ํ์ผ์์ ์ฌ์ฉํ ๋ณ์๋ช } from {๊ฒฝ๋ก} ๋ฅผ ์ฌ์ฉํด์ ํด๋น js ํ์ผ์์ ์ํ๋ ๋ถ๋ถ๋ง ๊ฐ์ ธ์ฌ ์ ์๋ค.
โผ export default { ๋ด๋ณด๋ผ ๊ฒ } ์ ์ฌ์ฉํด์ js ํ์ผ์์ ์ํ๋ ๋ถ๋ถ๋ง ๋ด๋ณด๋ผ ์ ์๋ค.
โผ import ์์์ a๋ ์๋ช ๋ถ๋ถ์ผ๋ก export ํ a ๋์ ๋ค๋ฅธ ๋ณ์๋ช ์ ์ฌ์ฉํด๋ a์ ๊ฐ์ด ์ ์ถ๋ ฅ๋๋ค.
/* preview.html ํ์ผ */
<script type="module">
import { a, b } from "/preview.js";
console.log(a); // 10
console.log(b); // 20
</script>
/* preview.js ํ์ผ */
let a = 10;
let b = 20;
export { a, b };
โผ export default๋ ํ์ผ ๋น 1ํ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
โผ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ด๋ณด๋ด๊ณ ์ถ๋ค๋ฉด export { {๋ด๋ณด๋ผ ๊ฒ}... } ์ ์ฌ๋ฌ ๊ฐ ์์ฑํด์ ์ฌ์ฉํ๋ค.
โผ html ํ์ผ์์ ๋ฐ์ ๋, ๋ด๋ณด๋ธ ๊ฒ์ ๋ณ์๋ช ์ ์ฌ์ฉํด์ ๋ฐ์์ผ ํ๋ค.
/* preview.html ํ์ผ */
<script type="module">
import exportDefaultVal, { a, b as other} from "/preview.js";
console.log(a); // 10
console.log(other); // 20
console.log(exportDefaultVal); // 30
</script>
/* preview.js ํ์ผ */
let a = 10;
let b = 20;
let c = 30;
export { a, b };
export default c;
โผ export, export default๋ฅผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
โผ import ํ ๋๋ export default ๊ฐ ๋ถํฐ ๋ฐ์ ํ ,(์ฝค๋ง)์ {}๋ฅผ ์ฌ์ฉํด์ export ๋ณ์๋ฅผ ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค.
โผ export ํ ๋ณ์๋ฅผ html ํ์ผ์์ ๋ค๋ฅธ ๋ณ์๋ช ์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ์ผ๋ฉด, as๋ฅผ ์ฌ์ฉํด์ ๋ค๋ฅธ ๋ณ์๋ช ์ผ๋ก ์ง์ ํ ์ ์๋ค.
/* preview.html ํ์ผ */
<script type="module">
import exportDefaultVal, * as obj from "/preview.js";
console.log(obj.a); // 10
console.log(obj.b); // 20
console.log(exportDefaultVal); // 30
</script>
/* preview.js ํ์ผ */
let a = 10;
let b = 20;
let c = 30;
export { a, b };
export default c;
โผ import ์ *์ ์ฌ์ฉํด์ ๋ชจ๋ export ๋ณ์๋ฅผ ๋ฐ๊ณ as obj๋ก ๋ณ์๋ช ์ ๋ณ๊ฒฝํ์ฌ Object ํ์์ผ๋ก ๋ณ์ ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
๐ฅ ๋ณ๋์ js ํ์ผ์ ๊ฐ์ ธ๋ค ์ฐ๊ณ ์ถ์ ๋๋ <script src={๊ฒฝ๋ก} /> ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ผ ํธํ์ฑ ์ข๋ค. ๊ทธ๋ฌ๋ React, Angular ๋ฑ์ ์ฌ์ฉํ ๋๋ ํด๋น ๋ฌธ๋ฒ์ ์ฌ์ฉํด์ ์ด๋ค.
๐ Promise
โผ JavaScript์์ ๋น๋๊ธฐ ํจ์ ํธ์ถ ๋๋ ๋น๋๊ธฐ ์ฐ์ฐ์ด ์๋ฃ๋์์ ๋, ์ดํ์ ์ฒ๋ฆฌํ ํจ์๋ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํจ์๋ฅผ ์ค์ ํ๋ ๋ชจ๋์ด๋ค.
โผ ์์ฐจ์ ์คํ์ ์ํด ์ฝ๋ฐฑ ํจ์ ๋์ ์ธ ์ ์๋ ์ฝ๋ฉ ํจํด์ด๋ค.
โผ 3๊ฐ์ง ์ํ๊ฐ ์กด์ฌํ๋ค. (resolved(์ฑ๊ณต), reject(์คํจ), pending(ํ์ ๋๊ธฐ ์ค))
โ ์ฌ์ฉ๋ฒ
let promise = new Promise(function (reslove, reject) {
let result = 1 + 1;
reslove(result); // promise๊ฐ ํจ์ ์คํ์ ์ฑ๊ณต ์ฒ๋ฆฌํ๋ค.
});
promise
.then(function (data) {
console.log(data); // 2
})
.catch(function () {
console.log("error");
});
let promise = new Promise(function (reslove, reject) {
try {
Exception();
reslove();
} catch (error) {
reject(error); // promise๊ฐ ํจ์ ์คํ์ ์คํจ ์ฒ๋ฆฌํ๋ค.
}
});
promise
.then(function () {
console.log("success");
})
.catch(function (err) {
console.log(err); // error๊ฐ ์ถ๋ ฅ๋๋ค.
});
โผ Promise๋ ํด๋น ํจ์๊ฐ ์ฑ๊ณต/์คํจ ํ๋์ง ํ์ ํ๋ ๊ธฐ๊ณ์ด๋ฉฐ, ์ดํ ์ฒ๋ฆฌ๋ฅผ ๋์์ค๋ค.
โผ Promise Object๋ฅผ ์์ฑํ ๋, reslove์ reject ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ํจ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ฑ๊ณต ์ฒ๋ฆฌ, ์คํจ ์ฒ๋ฆฌํ ์ ์๋ค.
โผ reslove({๊ฒฐ๊ณผ ๊ฐ}): ํจ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ฑ๊ณต ์ฒ๋ฆฌํ๋ฉฐ, ์ธ์๋ก ๋ฃ์ ๊ฒฐ๊ณผ ๊ฐ์ then({๋ณ์})์์ ๋ณ์๋ก ๋ฐ์ ์ฌ์ฉํ ์ ์๋ค.
โผ reject({Exception}): ํจ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์คํจ ์ฒ๋ฆฌํ๋ฉฐ, ์์ธ๋ฅผ ๋๊ฒจ์ catch({๋ณ์})์์ ๋ณ์๋ก ๋ฐ์ ์ฌ์ฉํ ์ ์๋ค.
โผ then({function}): ๋น๋๊ธฐ ํจ์ ํธ์ถ์ด ์ฑ๊ณต์ ์ผ๋ก ์ข ๋ฃ๋์์ ๋, ์ดํ ์ฒ๋ฆฌํ ํจ์๋ฅผ ๋ฑ๋กํ ์ ์๋ค.
โผ catch({function}): ๋น๋๊ธฐ ํจ์ ํธ์ถ์์ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋, ์๋ฌ ์ฒ๋ฆฌ ํจ์๋ฅผ ๋ฑ๋กํ ์ ์๋ค.
โผ finally({function}): ๋น๋๊ธฐ ํจ์ ํธ์ถ์ด ์ฑ๊ณต์ ์ด๋ , ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๋ฌด์กฐ๊ฑด ์คํํ๋ ํจ์๋ฅผ ๋ฑ๋กํ ์ ์๋ค.
๐ฌ Promise๋ ์คํ์ ๊ฒฐ๊ณผ(์ฑ๊ณต, ์คํจ)์ ๋ฐ๋ผ์, then(), catch()๊ฐ ์ ์ ํ๊ฒ ํธ์ถ๋์ด ์ดํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋๋ก ๋์์ฃผ๋ ๋ฌธ๋ฒ์ด๋ค.
๐ฌ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉด, js ํ์ผ์ ๋ชจ๋ ์ฝ๋๊ฐ ์ข ๋ฃ๋ ํ, Call Stack์ ๋ฑ๋ก๋์ด ์ฒ๋ฆฌ๋๋ค.
๐ฌ fetch() ํจ์๋ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์, then(), catch()๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
โ ์ด๋ฏธ์ง ๋ก๋ฉ ์ฒดํฌํ๋ Promise ๋ง๋ค๊ธฐ
<img id="test" src="js.png" />
<script>
// Promise ๊ฐ์ฒด ์์ฑ
let imgLoadingCheck = new Promise(function (reslove, reject) {
let img = document.querySelector("#test");
// ์ด๋ฏธ์ง ๋ก๋ฉ ์ฑ๊ณต
img.addEventListener("load", function () {
reslove();
});
// ์ด๋ฏธ์ง ๋ก๋ฉ ์คํจ
img.addEventListener("error", function () {
reject();
});
});
imgLoadingCheck
.then(function () {
console.log("์ฑ๊ณต"); // ์ถ๋ ฅ
})
.catch(function () {
console.log("์คํจ");
});
</script>
โผ ์ด๋ฏธ์ง ๋ก๋ฉ ์ฑ๊ณต/์คํจ Promise ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋๋ฉด, imgLoadingCheckPromise๋ฅผ ์ฌ์ฉํด์ then(), catch()๋ก ์ฑ๊ณต/์คํจ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
๐ async/await
โ async
async function add() {
console.log("1111");
1 + 1;
}
add().then(() => {
console.log("add Finish");
});
console.log("2222");
โผ async ํจ์ ์์ ๋ถ์ผ ์ ์๋ ํค์๋๋ก, ํด๋น ํค์๋๊ฐ ๋ถ์ function์ Promise ์ญํ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
โผ async ํจ์๋ ํจ์ ์คํ ํ, Promise ์ค๋ธ์ ํธ๊ฐ return ๋๋ค.
โผ ์คํ ์คํจ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ return Promise.reject({๋ด์ฉ})์ ์ฌ์ฉํด์ผ ํ๋ค.
โผ ์ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋ 1111 ์ถ๋ ฅ, 2222 ์ถ๋ ฅ, "add Finish"๊ฐ ํธ์ถ๋๋ค.
๐ฅ Promise ๊ฐ์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก, add ํจ์ ๋ด๋ถ์ ์ฝ๋๋ JavaScript ๋ฉ์ธ ์ฐ๋ ๋์์ ์คํ๋๊ณ , ํจ์๊ฐ ์ข ๋ฃ ํ, Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์, then()์ ๋ฑ๋กํ ์ฝ๋ฐฑ ํจ์๋ณด๋ค, ๋ค๋ฅธ ๋ชจ๋ ์ฝ๋๋ฅผ ์คํํ๊ณ , Call Stack์ด ๋น์์ ๋, then()์ ๋ฑ๋กํ ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋๋ค.
โ await
async function add() {
let promise = new Promise((resolve, reject) => {
console.log("1๋ฒ");
let result = 0;
for (let i = 0; i < 10; i++) {
result += i;
}
console.log(result);
resolve(result);
});
console.log("2๋ฒ");
try {
let result = await promise;
console.log("3๋ฒ");
console.log(`๊ฒฐ๊ณผ: ${result}`);
} catch (err) {}
console.log("4๋ฒ");
}
console.log("์์");
add().then(() => {
console.log("add Finish");
});
console.log("๋งจ์๋!");
โผ async function ์์์ ์ฌ์ฉํ๋ค.
โผ await์ Promise ๊ฐ์ฒด ์ธ์คํฐ์ค ์์ ์ฌ์ฉํด์ ์ฑ๊ณต/์คํจ ๊ฐ์ ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค.
โผ async function ์์์ Promise ๊ฐ์ฒด์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ๋ ๊น์ง, ๋๊ธฐํด์ async ํจ์ ๋ด๋ถ์ ์คํ ํ๋ฆ์ ๋ง์ถ ์ ์๋ค.
โผ ์ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋ "์์" -> "1๋ฒ" -> 45 -> "2๋ฒ" -> "๋งจ์๋!" -> "3๋ฒ" -> "๊ฒฐ๊ณผ: 45" -> "4๋ฒ" -> "add Finish" ์์๋ก ์ถ๋ ฅ๋๋ค.
๐ฅ await์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด?
async function add() {
let promise = new Promise((resolve, reject) => {
console.log("1๋ฒ");
let result = 0;
for (let i = 0; i < 10; i++) {
result += i;
}
console.log(result);
resolve(result);
});
console.log("2๋ฒ");
promise.then((res) => {
console.log(`๊ฒฐ๊ณผ: ${res}`);
});
console.log("3๋ฒ");
}
add().then(() => {
console.log("add Finish");
});
console.log("๋งจ์๋!");
โผ ์ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋ "1๋ฒ" -> 45 -> "2๋ฒ" -> "3๋ฒ" -> "๋งจ์๋!" -> "๊ฒฐ๊ณผ: 45" -> "add Finish" ์์์ด๋ค.
โผ await์ ์ฌ์ฉํด์ Promise ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐ์ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ , ์ฝ๋ ๋งจ ์๋๊น์ง ์คํํ ๋ค, Task Queue ์์์ ์ํด promise.then()์ ๋ฑ๋กํ ์ฝ๋ฐฑ ํจ์ ์คํ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๊ณ , ๋ค์์ผ๋ก add().then()์ ๋ฑ๋กํ ์ฝ๋ฐฑ ํจ์์ ์คํ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ค.
'Web > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] this ํค์๋ ์์๋ณด๊ธฐ (0) | 2023.04.24 |
---|---|
JavaScript ๊ธฐ๋ณธ ๋ฐ ์ฌ์ฉํ๊ธฐ (0) | 2023.04.23 |