Intro...
κ°μκΈ°(?) κ°μ λΆλμ΄ λ§μμ Έμ λ€ λ£λλΌ μ‘°κΈ νλ€μλ€.
μ΄μ λ μ§μ§ κ΅μ‘κ³Ό κ°λ°μ μ§μ€ν΄μΌκ² λ€.
μ€λ νμ΅ν λ΄μ©
: λ°μ΄ν° μ²λ¦¬ > κΈ°λ³Έ λ° flow control
μ°μ°μ
λ¨ν μ°μ°μ
- void: ννμμ νκ°ν λ κ°μ λ°ννμ§ μλλ‘ νλ μ°μ°μ
- typeof: νμ μ λ¬Έμμ΄λ‘ λνλ
- delete: κ°μ²΄ μμ± μμ
μ°μ μ°μ°μ
- λ¨ν μ°μ μ°μ°μ
- ++, --. μ«μ 1μ μ¦κ°/κ°μ μν€κ³ μ묡μ μΌλ‘ ν λΉ
- ++1, --1: μ μ μ¦κ°/κ°μ μ°μ°μ
- 1++, 1--: νμ μ¦κ°/κ°μ μ°μ°μ
- μ΄ν μ°μ μ°μ°μ
- +, -, /, *, %
κ΄κ³ μ°μ°μ
: νΌμ°μ°μλ₯Ό λΉκ΅ν΄ κ²°κ³Όμ λ°λΌ Boolean κ° λ°ν
- in / instaneof
const person = {
name: 'gayeon'
}
'name' in person // true
'age' in person // false
person instanceof Object // true
person instanceof String // false
λΉκ΅ μ°μ°μ
- ===. !==: κ°κ³Ό νμ μ΄ λͺ¨λ κ°κ±°λ λ€λ¦
- ==, !=: κ°μ΄ κ°κ±°λ λ€λ¦
- <, <=, >, >=
λ Όλ¦¬ μ°μ°μ
: λ κ°μ νΌμ°μ°μ μ€ νλλ₯Ό λ°ν, λ°νλλ κ°μ 무쑰건 Booleanμ μλ
- A && B, A || B
- null, undefined, ''λ falseλ‘ νκ°
- && => null κ²μ¬μ νμ©
- || => μΊμ± κ°μ λν΄ μ¬μ©
false || 'banana' // 첫 λ²μ§Έ νΌμ°μ°μκ° falseμΈ κ²½μ°, λ λ²μ§Έ νΌμ°μ°μκ° λ°νμ΄ λλ λμκ°μΉλ‘ νμ© λ¨
κΈ°ν μ°μ°μ
- μΌν μ°μ°μ: νΌμ°μ°μλ₯Ό μΌμͺ½μμ μ€λ₯Έμͺ½ μμλ‘ νκ°νκ³ λ§μ§λ§ μ°μ°μμ κ°μ λ°ν
const a = (1, 2)
a // 2
let x = 1
x = (x++, x)
x // 2
- λ¬Έμμ΄ μ°μ°μ
'μ¬κ³Όλ' + ' ' + 'λ§μλ€.' // μ¬κ³Όλ λ§μλ€.
- μ΅μ λ μ°μ°μ
const foo = { name: 'apple' }
foo.age?.apple // undefined
- ν λΉ μ°μ°μ
- +=, -=, *=, /=, %=, **=, &&=, ||=
- μΌν μ°μ°μ
- 쑰건문 ? μ°ΈμΌ κ²½μ° λ°ν: κ±°μ§μΌ κ²½μ° λ°ν
μ¬μ¬μ© μ²λ¦¬κΈ° (=ν¨μ)
μΈλΆ μ½λκ° νΈμΆν μ μλ νμ νλ‘κ·Έλ¨
- input: μ²λ¦¬λ₯Ό μν μ£Όμ λ°μ΄ν°
- output: μ²λ¦¬ ν κ²°κ³Ό λ°μ΄ν°
- λ³Έλ¬Έ: λͺ λ Ήλ¬Έμ μνμ€λ‘ ꡬμ±
μλ°μ€ν¬λ¦½νΈμμ ν¨μλ κ°μ²΄μ²λΌ μμ±κ³Ό λ©μλλ₯Ό κ°μ§ μ μλ€.
κ°μ²΄μμ μ°¨μ΄μ μ ν¨μλ μΈλΆμμ 'νΈμΆ'μ΄ κ°λ₯νλ, κ°μ²΄λ μΈλΆμμ 'νΈμΆμ΄ λΆκ°μΌνλ€.
μλ°μ€ν¬λ¦½νΈ ν¨μλ μΌκΈκ°μ²΄μ΄λ€.
μΌκΈκ°μ²΄λ, λ€λ₯Έ κ°μ²΄λ€μ μΌλ°μ μΌλ‘ μ μ© κ°λ₯ν μ°μ°μ λͺ¨λ μ§μνλ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
- μΌκΈ κ°μ²΄λ ν¨μμ μ€μ λ§€κ°λ³μκ° λ μ μλ€.
function foo(input) {
return input() + 1;
}
function bar() {
return 1;
}
foo(bar) // 2
- ν¨μμ λ°νκ°μ΄ λ μ μλ€.
// input()() -> bar() -> 1
function foo(input) {
return input()() + 1;
}
function bar() {
return 1;
}
function baz() {
return bar;
}
foo(baz); // 2
- ν λΉλͺ λ Ήλ¬Έ (=) μ λμμ΄ λ μμλ€.
- λμΌ λΉκ΅ λμμ΄ λ μ μλ€. (κ°μΌλ‘ νν κ°λ₯)
μλ°μ€ν¬λ¦½νΈ ν¨μ νΉμ§
- ν¨μ μ΄λ¦: μΈλΆμμ νΈμΆ μ μ΄λ¦μ΄ μ¬μ©λλ€.
- λ§€κ° λ³μ: ν¨μμ μ λ¬λλ μΈμ
- ν¨μ λͺΈμ²΄: λͺ λ Ή μνμ€λ€μ΄ μ‘΄μ¬νλ λΈλ‘
λ§€κ°λ³μ
- κΈ°λ³Έκ° λ§€κ°λ³μ
function foo(a = 1) {
return a;
}
foo() // 1
- λλ¨Έμ§ λ§€κ°λ³μ
- κ°λ³ν ν¨μ
- spread μ°μ°μ
function foo(arg, ...rest) {
console.log(rest);
return arg;
}
foo('a','b','c') // ['b', 'c']
// a
- arguments κ°μ²΄: ν¨μμ μ λ¬λλ μΈμλ₯Ό μ°Έμ‘°ν μ μλ κ°μ²΄
- μλ°μ€ν¬λ¦½νΈ ν¨μ => Function κ°μ²΄ μμ
- Function κ°μ²΄μ κΈ°λ³Έ μμ± => arguments
- νν: μ μ¬ λ°°μ΄ νν (=λ°°μ΄ λ΄μ₯ λ©μλ μ¬μ© λΆκ°)
β λ§€κ°λ³μ(parameter)μ μΈμ(argument)μ μ°¨μ΄
: λ§€κ°λ³μλ ν¨μλ₯Ό μ μν λ μ¬μ©νλ λ³μμ΄κ³ , μΈμλ ν¨μκ° νΈμΆλ λ λκΈ°λ κ°
function ν¨μλͺ
(λ§€κ°λ³μ) {
return λ§€κ°λ³μ;
}
ν¨μλͺ
('a') // <- 'a': μΈμ
ν¨μ μμ± λ°©λ²
- ν¨μ μ μΈλ¬Έ
function foo(arg) {
return arg;
}
- ν¨μ ννμ
const foo = function (arg) {
return arg;
}; // μ΅λͺ
ν¨μ
const bar = function baz(arg) {
return arg;
}; // κΈ°λͺ
ν¨μ
const temp = foo(1);
console.log(temp);
console.log(baz(1)); // ReferenceError: baz is not defined (barλ‘ νΈμΆν΄μΌ ν¨)
- Function μμ±μ ν¨μ
- new Function(arg1, arg2, ..., 'return 1')
const bar = new Function(undefined, 'return 1');
bar(1) // 1
- νμ΄ν ν¨μ (ES6 μ΄ν)
- μ΅λͺ ν¨μ (ν¨μ ννμμΌλ‘λ§ μ¬μ© κ°λ₯)
- const λ³μλͺ = (arg1, ...) => { return ... }
ν¨μ μ¬μ© ν¨ν΄
- μ¦μ μ€ν ν¨μ (IIFE)
- ν¨μ μ μμ λμμ μ€ν
- μ½λ νκ° -> μ½λ μ€ν -> μ΅μ΄ 1ν μ€ν9
- λ¨ ν λ²λ§ νΈμΆλλ©° λ€μ νΈμΆ X
- μ΄κΈ°ν μ²λ¦¬μ μ£Όλ‘ μ¬μ©
(function() {
console.log('foo')
}())
- μ¬κ· ν¨μ
- μκΈ° μμ μ νΈμΆνλ ν¨μ
- νμΆ μ‘°κ±΄μ ν¨μ μ΄λ°μ μ μν΄μΌ νλ€.
- μ§κ΄μ±μ΄ λ¨μ΄μ§ μ μμ
- μ€μ²© ν¨μ
- λ΄λΆ ν¨μ
- λ΄λΆ ν¨μ λ΄μ λ³μ μ°Έμ‘° -> λΆλͺ¨λ₯Ό ν¬ν¨ν μΈλΆ λ²μ μ°Έμ‘° κ°λ₯
- λΆλͺ¨ ν¨μ λ΄μ λ³μ μ°Έμ‘° -> μμ λ²μ μ°Έμ‘° λΆκ°
- μ€μ½ν 체μΈ
- μ½λ°± ν¨μ
- ν¨μμ λ§€κ°λ³μκ° λ μ μλ€.
- μΈμλ‘ Bν¨μλ₯Ό λ°μ Aν¨μ -> Aν¨μκ° νΈμΆλλ μμ μ B ν¨μλ νΈμΆ
- νΉμ μ΄λ²€νΈκ° λ°μνμ λ -> μμ€ν μ μν΄ νΈμΆλλ ν¨μ
Flow Control
: λͺ λ Ή λλ ν¨μ νΈμΆμ΄ μ€νλκ±°λ νκ°λλ μμ
- goto: λ€λ₯Έ ꡬ문μμ μμ (κΆμ₯νμ§ μμ)
- choice: if-else, switch
- loop
- continue
- break
ννμκ³Ό λ¬Έ
- ννμ: μ΄λ€ κ°μΌλ‘ μ΄νλλ μμμ μ ν¨ν μ½λ λ¨μ
- ννμμ΄ νκ°λλ©΄, μλ‘μ΄ κ°μ μμ±νκ±°λ κΈ°μ‘΄ κ°μ μ°Έμ‘°
- κ°μΌλ‘ νκ°λ μ μλ λ¬Έμ λͺ¨λ ννμ
- 리ν°λ΄ ννμ, ν¨μ ννμ, ...
- λ¬Έ: νλ‘κ·Έλ¨μ ꡬμ±νλ κΈ°λ³Έ λ¨μ, μ΅μ μ€ν λ¨μ
- == λͺ λ Ήλ¬Έ
- μ μΈλ¬Έ, ν λΉλ¬Έ, μ μ΄λ¬Έ, λ°λ³΅λ¬Έ, λΈλλ¬Έ ({ ... }) ...
쑰건문
- if-else문
- λ§ν΄ νμΈλ¬μ 리ν©ν λ§ μλ£μμ nested conditionalμ μ§μνκ³ Guard Clauses ννλ‘ κ΅¬νμ μ§ν₯ ν¨
- switch
λ°λ³΅λ¬Έ
- μ‘°κ±΄λΆ loop
- μμν λ 쑰건μ νκ°νλ νμ
- while문
- λ³Έλ¬Έ μλ΅ κ°λ₯
- λ§μ§λ§μ 쑰건μ νκ°νλ νμ
- do...while문
- λ³Έλ¬Έμ νμ ν λ² μ΄μ μ€ν
- μμν λ 쑰건μ νκ°νλ νμ
do {
λͺ
λ Ήλ¬Έ
} while (ννμ);
- for loop
- for(μ΄κΈ°λ¬Έ;쑰건문;μ¦κ°λ¬Έ;) { ... } νμ
- 쑰건문: loopλ΄ μ½λ μ€ν μ , 쑰건 νκ°νμ¬ loopλ₯Ό μ§μν μ§ νλ¨
- μ¦κ°λ¬Έ: loopλ΄ μ½λ μ€ν ν, μ€νλλ λ¬Έμ₯
- collection loop (foreach)
- forλ¬Έκ³Ό λ¬λ¦¬ λͺ μμ μΌλ‘ μΉ΄μ΄ν°(루νλ³μ)λ₯Ό κ΄λ¦¬νμ§ μλλ€.
- μ μ¬μ μΈ μν νμ μ€λ₯λ₯Ό μλ°©νλ€.
- μλ°μ€ν¬λ¦½νΈ 컬λ μ
루ν μ’
λ₯ => for...of, for...in
- for...of: λ°λ³΅ κ°λ₯ν κ°μ²΄(Array, Set, String...)λ₯Ό ν΅ν΄ λ°λ³΅νλ 루νλ₯Ό λ§λ λ€.
- for...in: for([λ³μ] in [object]) { ... } κ°μ²΄ μ΄κ±° μμ±μ ν΅ν΄ μ§μ λ λ³μλ₯Ό λ°λ³΅
- break λ¬Έ
- μ μ΄νλ¦μ μ’ λ₯ μ€ νλ‘κ·Έλ¨ μ€ν μ€λ¨
- λ°λ³΅λ¬Έ, switchλ¬Έ μ’ λ£μν¬ λ μ¬μ©
- κ°μ₯ κ°κΉμ΄ while, do-while, for, switchλ¬Έμ μ’ λ£νκ³ λ€μ λͺ λ Ήμ΄λ‘ λμ΄κ°
- continue λ¬Έ
- μ μ΄νλ¦μ μ’ λ₯ μ€ νμ¬ μ€ν ꡬ문μμ λ¨μ΄μ§ ν ꡬ문μ μ§ν© μ€ν μ’ λ₯μ μν¨
- while, do...while, forλ¬Έμ λ€μ μμνκΈ° μν΄ μ¬μ©
- κ°μ₯ μμͺ½μ while, do-while, forλ¬Έμ λλ¬μΌ λ°λ³΅μ μ’ λ£νκ³ , λ€μ loop μ€ν
const foo = () => {
let const = 0;
while(count<3) {
count++;
console.log(count);
continue;
console.log('μ¬κΈ°');
}
};
foo(); // 1 2 3
μμΈ μ²λ¦¬νκΈ°
μμΈ μν©
: λ°νμ λ λ°μν μ μλ μλμΉ μμ μν©μΌλ‘
νλ¦ μ μ΄ μ λ°μν μ μλ μμΈ μν©μ΄λ―λ‘, μ΄λ₯Ό μ΄ν΄νμ¬ μ½λ λ 벨μμ λμν΄μΌ νλ€.
μμΈ μν©μ νΈλ€λ§νμ§ μμΌλ©΄ κΈ°λ₯μ΄ λμνμ§ μκ±°λ μ΄ν리μΌμ΄μ μ΄ μ’ λ£λ μ μλ€.
μμΈ μμΈ
- μ½λ λ 벨 λ¬Έμ
- νλμ¨μ΄, λλ°μ΄μ€ λ¬Έμ
- λΌμ΄λΈλ¬λ¦¬ μμ
- μ¬μ©μ μ λ ₯ μ€μ
- ...
μμΈ μ’ λ₯
- ECMAScript Error: μλ°μ€ν¬λ¦½νΈμμ λ°μνλ μλ¬ νμ
- RangeError: κ°μ΄ μ§ν©μ μκ±°λ, νμ© λ²μκΈ° μλ λ
- ReferenceError: μ‘΄μ¬νμ§ μλ λ³μ μ°Έμ‘° μ
- SyntaxError: λ¬Έλ²μ μ§ν€μ§ μμμ λ
- TypeError: κ°μ΄ κΈ°λν μλ£νμ΄ μλμ¬μ μ°μ°μ΄ λΆκ°ν λ
- …
- DOMException: Wep API λ 벨μμ λ°μνλ μλ¬ νμ
- NetworkError: λ€νΈμν¬ μλ¬ λ°μ μ
- AbortError: μμ μ΄ μ€λ¨λμμ λ
- TimeoutError: μμ μκ°μ΄ μ΄κ³Όλμμ λ
- …
- κ·Έ μΈ
- κ°λ°μκ° μμμΉ λͺ»ν μμΈ μν©μ μμν΄ νΈλ€λ§
- μλ°μ€ν¬λ¦½νΈμ Error κ°μ²΄λ₯Ό μ¬μ©ν΄ μ§μ μλ¬λ₯Ό μ μλ΄λ¦¬κ³ νΈλ€λ§ν μ μλ€.
μμΈ μ²λ¦¬
- throw λ¬Έ
- μμΈλ₯Ό λ°μμν¬ λ μ¬μ©, throwλ¬Έ μ΄ν λͺ λ Ήλ¬Έμ μ€νλμ§ μμ
- catch λΈλ‘μμ μλ¬ κ°μ²΄λ₯Ό νΈλ€λ§ ν¨
- μμ
- μμΈ λ°μ μ, νμ¬ ν¨μ μ€ν μ€μ§
- μλ¬κ°μ²΄μ ν¨κ» μλ¬κ° throw
- νΈμΆμ μ¬μ΄μ catchλΈλ‘μ΄ μμΌλ©΄ catchλΈλ‘μΌλ‘ μ λ¬ μμΌλ©΄ νλ‘κ·Έλ¨ μ’ λ£
- Error κ°μ²΄
- μ¬μ©μκ° μ§μ Errorrκ°μ²΄ μ μ
- new Error('μλ¬ λ©μμ§')
- Error.message
- Error.name
- ECMAScript νμ€ λ΄μ₯ μ€λ₯ μ ν μ‘΄μ¬
- try...catch λ¬Έ
- μλ¬ catch
- μμΈκ° λ°μν κ²½μ°, μμΈ μ²λ¦¬λ₯Ό λ§‘μ νλ μ΄μμ λ°μ λͺ
λ Ήλ¬Έμ μ§μ
- try λΈλ‘μ λͺ λ Ήλ¬Έ μ€ νλκ° μ€ν¨νλ©΄, catchλ‘ μ μ΄κΆμ΄ λμ΄κ°
- try λΈλ‘μ λͺ λ Ήλ¬Έ μ€ νλκ° μ±κ³΅νλ©΄, catchλ‘ μ μ΄κΆμ΄ λμ΄κ°μ§ μμ
- cahtchλ¬Έμμ μμΈκ° μ²λ¦¬ λλ©΄ λ μμ μ½μ€νμμ λμ΄μ μμΈκ° νκ³ μ¬λΌκ°μ§ μμ
- finally λΈλ‘
- tryλΈλ‘μμ μμΈ μν©μ΄ λ°μνμ§ μλλΌλ μ€ν
- μμΈ λ°μμ try→catch→finally
- λ°μ x try→finally
- networkμλ¬ μ, μλ¬λ₯Ό κ°μ§ν΄μΌνλ λΉμ¦λμ€ λ‘μ§, μ μ κ° μλͺ» λ°μ΄ν°λ₯Ό μ λ ₯ν κ²½μ° λ± μΈλΆμ μμ‘΄λμ΄μ ꡬνλ λ‘μ§μμ μ¬μ©
β οΈ call stack
: μλ°μ€ν¬λ¦½νΈ μ½λκ° μ€νλλ©° μμ±λλ μ€ν 컨ν μ€νΈλ₯Ό μ μ₯νλ μλ£κ΅¬μ‘°
ν¨μλ₯Ό νΈμΆν λλ§λ€ μ€νμ΄ μμ΄κ³ , ν¨μμ μ€νμ΄ μ’ λ£λλ©΄ μ½μ€νμμ μ€νμ μ κ±°νλ μ리
Error throwλλ©΄ μ½ μ€νμ νμΈνμ¬, νΈλ€λ§νκ³ μλ catchλ¬Έμ΄ μλ μ€νμμ μ²λ¦¬νλ€.
λ§λ¬΄λ¦¬
μ¬μ λΆλ¦¬λ€κ° κ°μλ₯Ό λ―Έλ€μ λ€μ λ» νλ€.
TILμ λ―Έλ€μ‘μ§λ§... 곡λΆν λ΄μ©μ΄ λ§μμ 볡μ΅μ μ΄μ¬ν ν΄μΌν κ² κ°λ€.
