// ν©ν 리μΌ
// n! = 1 * 2 * 3 * ... * n
function factorial(n) {
if (n <= 1) {
return n;
}
return n * factorial(n - 1);
}
console.log(factorial(5)); // 120
// μκ·Έλ§
function sigma(n) {
if (n <= 1) {
return n;
}
return n + sigma(n - 1);
}
console.log(sigma(5)); // 15
// νΌλ³΄λμΉ μμ΄
// νΌλ³΄λμΉ μμ΄μ 0κ³Ό 1λ‘ μμ, λ€μ νΌλ³΄λμΉ μλ λ°λ‘ μμ λ νΌλ³΄λμΉ μμ ν©μ΄ λλ€.
// 0, 1, 1, 2, 3, 5, 8, 13, ...
function fibonacci(n) {
if (n < 2) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
console.log(fibonacci(0)); // 0
console.log(fibonacci(1)); // 1
console.log(fibonacci(2)); // 1 = fibonacci(1) + fibonacci(0)
console.log(fibonacci(3)); // 2 = fibonacci(2) + fibonacci(1)
console.log(fibonacci(4)); // 3 = fibonacci(3) + fibonacci(2)
μ¬κ· ν¨μλ stackμ΄λΌλ λ©λͺ¨λ¦¬ κ³΅κ° μ¬μ©
- λ°λ³΅μ μΌλ‘ stack λ©λͺ¨λ¦¬ 곡κ°μ μ΄μ©νκΈ° λλ¬Έμ μ±λ₯μ΄ μ’μ§ μλ€.
- νΈμΆλλ κ²μ΄ λ©λͺ¨λ¦¬λ₯Ό μ°¨μ§νκ³ μμΌλ―λ‘ λ°λ³΅λ¬Έ, λ€μ΄λλ―Ή νλ‘κ·Έλλ°(λ©λͺ¨μ΄μ μ΄μ (νν₯μ), νλ·Έλ μ΄μ (μν₯μ))μ μ μ ν λ―Ήμ±ν΄μ μ¬μ©
- λ©λͺ¨μ΄μ μ΄μ (Memoization) : ν λ² κ³μ°ν κ²°κ³Όλ₯Ό μΊμμ λ©λͺ¨(μ μ₯)νλ κ²
=> λ°λ³΅λλ κ²°κ³Όλ₯Ό λ©λͺ¨λ¦¬μ μ μ₯ν΄μ λ λ€λ₯Έ κ²°κ³Όλ₯Ό κ³μ°ν λ 빨리 μ€νλ μ μλλ‘ νλ€.// λ©λͺ¨μ΄μ μ΄μ let fibo_cache = []; function fibo(n) { if (n in fibo_cache) { return fibo_cache[n]; } fibo_cache[n] = n < 2 ? n : fibo(n - 2) + fibo(n - 1); return fibo_cache[n]; }
// κΈ°λͺ
μ¦μ μ€ν ν¨μ
(function myFunc() {
var a = 3;
var b = 5;
return a + b;
}());
// μ΅λͺ
μ¦μ μ€ν ν¨μ
(function () {
var a = 3;
var b = 5;
return a + b;
}());
// ν¨μ μ μΈλ¬Έμ μλ°μ€ν¬λ¦½νΈ μμ§μ μν΄ ν¨μ λͺΈμ²΄λ₯Ό λ«λ μ€κ΄νΈ λ€μ μΈλ―Έμ½λ‘ (;)μ΄ μλμΌλ‘ μΆκ°λλ€.
function () {
...
}(); // };(); μ΄λ κ²
// λ°λΌμ μ¦μ μ€ν ν¨μλ μ 체λ₯Ό μκ΄νΈλ‘ κ°μΈμ€λ€.
(function () {
...
}());
μ°Έκ³ λ§ν¬
function change(parameter) {
console.log(Object.is(parameter, num)); // true => parameterμ numμ΄ κ°μ κ°μ κ°λ¦¬ν€κ³ μλ€.
parameter += 10;
// parameterμ κ°μ΄ λ°λλ©΄ parameterμ numμ λ©λͺ¨λ¦¬ μ£Όμκ° λ¬λΌμ§λ€
console.log(Object.is(parameter, num)); // false => parameter != num
return parameter;
}
let num = 0;
// changeν¨μμ numμ μ λ¬,
console.log(change(num)); // 10 μ΄ λ°νλ¨
// μλ³Έ κ°μΈ numμ΄ changeν¨μμ μν΄ λ°κΌλμ§ νμΈ
console.log(num); // 0 => μ¨μ μλ°λ! μλ³Έκ°μ μ λ°λ!
function changeObj(primitive, object) {
console.log(Object.is(primitive, prm_num)); // true
console.log(Object.is(object, obj)); // true => κ°μ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό κ°λ¦¬ν΄
console.log(prm_num); // 0
console.log(obj); // { name: 'Name', age: 'Age' }
primitive += 10;
object.name = "Changed Name";
object.age = "Changed Age";
console.log(Object.is(primitive, prm_num)); // false => call by value μ°Έκ³
console.log(Object.is(object, obj)); // true => μ¬μ ν κ°μ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό κ°λ¦¬ν΄
console.log(primitive); // 10
console.log(prm_num); // 0 => μλ³Έ κ° λ°λμ§ μμ
console.log(obj); // { name: 'Changed Name', age: 'Changed Age' } => μλ³Έ λ°μ΄ν° λ°λ
}
let prm_num = 0;
let obj = {
name: "Name",
age: "Age",
};
changeObj(prm_num, obj);
console.log(prm_num); // 0
console.log(obj); // { name: 'Changed Name', age: 'Changed Age' }
// call by sharing μμ 1
function changeEmptyObj(obj) {
obj = { item1: "Changed item1" }; // obj μ£Όμ μ¬ν λΉ
obj.item2 = "Changed item2"; // μ£Όμ μ¬ν λΉ λ objμ item2 λ³κ²½
console.log(obj); // { item1: 'Changed item1', item2: 'Changed item2' } => μ£Όμ μ¬ν λΉ λ obj
}
let originalObj = { item1: "item1", item2: "item2" };
changeEmptyObj(originalObj);
console.log(originalObj); // { item1: 'item1', item2: 'item2' } => μλ³Έ λ°μ΄ν°λ λ³νμ§ μμ
// call by sharing μμ 2
function changeEmptyObj(obj) {
// μμ 1μ μ½λ μμλ₯Ό λ³κ²½ν¨
obj.item2 = "Changed item2"; // originalObj.item2 λ³κ²½
obj = { item1: "Changed item1" }; // obj μ£Όμ μ¬ν λΉνλ©΄μ originalObjμ λ¬λΌμ§, 볡μ¬λ obj.item1μ κ°μ λ°λκ³ item2λ μμ΄μ§
console.log(obj); // { item1: 'Changed item1' } => item1λ§ λ¨μ obj μΆλ ₯
}
let originalObj = { item1: "item1", item2: "item2" };
changeEmptyObj(originalObj);
console.log(originalObj); // { item1: 'item1', item2: 'Changed item2' } => changeEmptyObjμ μν΄ item2λ λ³κ²½λ¨
map
μ λ°°μ΄ μμ μ 체λ₯Ό λμμΌλ‘ ν¨μλ₯Ό νΈμΆνκ³ , ν¨μ νΈμΆ κ²°κ³Όλ₯Ό λ°°μ΄λ‘ λ°νlet result = arr.map(function(item, index, array) {
// μμ λμ μλ‘μ΄ κ°μ λ°ν
});
let array = [1, 4, 9, 16];
let κ°1 = array.map((x) => x * 2);
console.log(array); // [ 1, 4, 9, 16 ]
console.log(κ°1); // [ 2, 8, 18, 32 ]
function μ κ³±(x) {
return x ** 2;
}
κ°2 = array.map(μ κ³±);
console.log(κ°2); // [ 1, 16, 81, 256 ]
// sqrt = square root
console.log(array.map(Math.sqrt).map((x) => x ** 3)); // [ 1, 8, 27, 64 ]
filter
λ true
κ°μΈ κ²λ§ λ°νconst words = [
"spray",
"limit",
"elite",
"exuberant",
"destruction",
"present",
];
// word.length > 6κ° true κ°λ§ λ°ν
const result = words.filter((word) => word.length > 6);
console.log(result); // [ 'exuberant', 'destruction', 'present' ]
κ΅¬λΆ | κ°μ²΄ | Map |
---|---|---|
ν€λ‘ μ¬μ©ν μ μλ κ° | λ¬Έμμ΄, μ¬λ²κ° | κ°μ²΄λ₯Ό ν¬ν¨ν λͺ¨λ κ° |
μ΄ν°λ¬λΈ | β | β |
μμ κ°μ νμΈ λ°©λ² | Object.key(obj).length | map.size |
new Map()
: μμ±μ ν¨μλ‘ λ§΅ μμ±map.set(key, value)
: 맡μ κ° λ£κΈ°. key
λ₯Ό μ΄μ©ν΄ value
λ₯Ό μ μ₯map.get(key)
: key
μ ν΄λΉνλ κ° λ°ν. key
κ° μ‘΄μ¬νμ§ μμΌλ©΄ undefined
λ°νmap.has(key)
: key
κ° Map
μ μ‘΄μ¬νλ©΄ true
, μ‘΄μ¬νμ§ μμΌλ©΄ false
λ°νmap.delete(key)
: key
μ ν΄λΉνλ κ° μμ map.clear()
: 맡 μμ λͺ¨λ μμ μ κ±°map.size
: 맡 μμ μμ κ°―μ λ°ν맡 κ°μ²΄λ μ΄ν°λ¬λΈμ΄λ©΄μ μ΄ν°λ μ΄ν°μΈ κ°μ²΄λ₯Ό λ°ννλ λ©μλλ₯Ό μ 곡
=> for of
λ¬ΈμΌλ‘ μνν μ μλ€.
map.key()
: κ° μμμ ν€λ₯Ό λͺ¨μ λ°λ³΅ κ°λ₯ν(iterable) κ°μ²΄λ₯Ό λ°ν
map.values()
: κ° μμμ κ°μ λͺ¨λ μ΄ν°λ¬λΈ κ°μ²΄ λ°ν
map.entries()
: μμμ [ν€, κ°]
μ ν μμΌλ‘ νλ μ΄ν°λ¬λΈ κ°μ²΄λ₯Ό λ°ν
맡μ μμμ μμμ μλ―Έλ₯Ό κ°μ§ μμ§λ§ 맡 κ°μ²΄λ₯Ό μννλ μμλ μμκ° μΆκ°λ μμλ₯Ό λ°λ₯Έλ€.
=> ECMAScript μ¬μμ κ·μ λμ΄ μμ§ μμ§λ§ λ€λ₯Έ μ΄ν°λ¬λΈμ μνμ νΈνμ±μ μ μ§νκΈ° μν¨
λ°°μ΄ : μμκ° μλ 컬λ μ μ μ μ₯
Set : μ€λ³΅λμ§ μλ μ μΌν κ°λ€μ μ§ν©.
=> λ°°μ΄κ³Ό μ μ¬νμ§λ§ μ°¨μ΄μ μ΄ μλ€.
Setμ νΉμ±μ μνμ μ§ν©μ νΉμ±κ³Ό μΌμΉ
=> Setμ μνμ μ§ν©μ ꡬννκΈ° μν μλ£κ΅¬μ‘°
=> Setμ ν΅ν΄ κ΅μ§ν©, ν©μ§ν©, μ°¨μ§ν©, μ¬μ§ν© λ± κ΅¬ν κ°λ₯
κ΅¬λΆ | λ°°μ΄ | Set |
---|---|---|
λμΌν κ°μ μ€λ³΅νμ¬ ν¬ν¨ κ°λ₯ | β | β |
μμ μμμ μλ―Έ | β | β |
μΈλ±μ€λ‘ μμμ μ κ·Ό | β | β |
μ£Όμ λ©μλμ νλ‘νΌν°
new Set(iterable)
: μμ±μ ν¨μλ‘ Set μμ±set.add(key, value)
: κ°μ μΆκ°νκ³ Set μμ μ λ°νset.has(key)
: Set λ΄μ κ°μ΄ μ‘΄μ¬νλ©΄ true
, μλλ©΄ false
λ°νset.delete(key)
: κ°μ μ κ±°. νΈμΆ μμ μ Set λ΄μ κ°μ΄ μμ΄μ μ κ±°μ μ±κ³΅νλ©΄ true
, μλλ©΄ false
λ°νset.clear()
: Setμ λͺ¨λ μμ μΌκ΄ μμ set.size
: Set μμ μμ κ°―μ λ°ν
μ λ³΄κ³ κ°λλ€ γ γ γ