๐Ÿš€ JavaScript Session 1

Functions & Modern ES6+ Features

๐Ÿ“‹ แƒกแƒ”แƒกแƒ˜แƒ˜แƒก แƒ’แƒ”แƒ’แƒ›แƒ

แƒกแƒฌแƒแƒ•แƒšแƒ˜แƒก แƒ›แƒ˜แƒ–แƒœแƒ”แƒ‘แƒ˜:

  • JavaScript-แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒกแƒแƒฎแƒ˜แƒก แƒ’แƒแƒ’แƒ”แƒ‘แƒ
  • Scope-แƒ˜แƒก แƒชแƒœแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒฃแƒคแƒšแƒ”แƒ‘แƒ
  • Closures-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ
  • ES6+ แƒ—แƒแƒœแƒแƒ›แƒ”แƒ“แƒ แƒแƒ•แƒ” แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒฌแƒแƒ•แƒšแƒ
  • Destructuring-แƒ˜แƒก แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒ”แƒ‘แƒ˜
  • Modular JavaScript-แƒ˜แƒก แƒกแƒแƒคแƒฃแƒซแƒ•แƒšแƒ”แƒ‘แƒ˜
โฑ๏ธ แƒกแƒ”แƒกแƒ˜แƒ˜แƒก แƒฎแƒแƒœแƒ’แƒ แƒซแƒšแƒ˜แƒ•แƒแƒ‘แƒ: 2.5 แƒกแƒแƒแƒ—แƒ˜
๐Ÿ“š แƒฃแƒœแƒแƒ -แƒฉแƒ•แƒ”แƒ•แƒ”แƒ‘แƒ˜: Intermediate JavaScript Programming
๐Ÿ”ง แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜: VS Code, Browser DevTools, Node.js

๐Ÿ“… แƒกแƒ”แƒกแƒ˜แƒ˜แƒก แƒ’แƒแƒœแƒ แƒ˜แƒ’แƒ˜:

  • 00:00-00:30 - แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒ”แƒ‘แƒ˜ แƒ“แƒ Scope
  • 00:30-01:00 - Lexical Scope แƒ“แƒ Closures
  • 01:00-01:15 - โ˜• Break
  • 01:15-02:00 - ES6+ Features (Rest, Spread, Destructuring)
  • 02:00-02:30 - Modules แƒ“แƒ แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒฃแƒšแƒ˜ แƒ•แƒแƒ แƒฏแƒ˜แƒจแƒ”แƒ‘แƒ˜

๐Ÿ”ง แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒ”แƒ‘แƒ˜

JavaScript-แƒจแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก 3 แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒกแƒแƒฎแƒ”:

  • Function Declaration - แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒ
  • Function Expression - แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ
  • Arrow Function - แƒ˜แƒกแƒ แƒ˜แƒกแƒ”แƒ‘แƒ แƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ (ES6)

1๏ธโƒฃ Function Declaration


// Function Declaration
function greetUser(name) {
    return `Hello, ${name}!`;
}

// แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒแƒ›แƒ“แƒ”แƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ (Hoisting)
console.log(sayHi()); // "Hi there!"

function sayHi() {
    return "Hi there!";
}

2๏ธโƒฃ Function Expression

// Function Expression
const [sum, difference, product, quotient] = calculate(10, 5);
console.log(`Sum: ${sum}, Difference: ${difference}`);
// Sum: 15, Difference: 5

// Nested arrays
const matrix = [[1, 2], [3, 4]];
const [[a, b], [c, d]] = matrix;
console.log(a, b, c, d); // 1 2 3 4

3๏ธโƒฃ Arrow Function (ES6)

// Arrow Function - แƒ›แƒแƒ™แƒšแƒ” แƒกแƒ˜แƒœแƒขแƒแƒฅแƒกแƒ˜
const greetUser = (name) => {
    return `Hello, ${name}!`;
};

// แƒ™แƒ˜แƒ“แƒ”แƒ• แƒฃแƒคแƒ แƒ แƒ›แƒแƒ™แƒšแƒ”
const greetUser2 = name => `Hello, ${name}!`;

// แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜
const add = (a, b) => a + b;

// แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”
const getRandomNumber = () => Math.random();

console.log(add(5, 3)); // 8
// Anonymous Function Expression
                greetUser = function(name) {
return `Hello, ${name}!`;
};

// Named Function Expression
const calculate = function calc(x, y) {
return x + y;
};

// แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ Hoisting แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก
console.log(greetUser("Ana")); // "Hello, Ana!"
๐Ÿ”‘ แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒ”แƒ‘แƒ˜:
โ€ข Arrow functions แƒแƒ  แƒแƒฅแƒ•แƒ— แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ this
โ€ข Function declarations แƒ˜แƒฌแƒ•แƒ”แƒ•แƒ”แƒœ hoisting-แƒก
โ€ข Arrow functions แƒฃแƒคแƒ แƒ แƒ™แƒแƒ›แƒžแƒแƒฅแƒขแƒฃแƒ แƒ˜ แƒกแƒ˜แƒœแƒขแƒแƒฅแƒกแƒ˜ แƒแƒฅแƒ•แƒ—
๐Ÿ’ก แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒฃแƒžแƒ˜แƒ แƒแƒขแƒ”แƒกแƒแƒ‘แƒ”แƒ‘แƒ˜:
โ€ข แƒ™แƒแƒ“แƒ˜ แƒฃแƒคแƒ แƒ แƒ›แƒแƒ™แƒšแƒ” แƒ“แƒ แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒแƒ“แƒ˜
โ€ข แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒจแƒ”แƒชแƒ•แƒšแƒ
โ€ข แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ

๐ŸŽฏ Scope แƒกแƒแƒคแƒฃแƒซแƒ•แƒšแƒ”แƒ‘แƒ˜

แƒ แƒ แƒแƒ แƒ˜แƒก Scope?

Scope แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒก แƒกแƒแƒ“ แƒแƒ แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒ™แƒแƒ“แƒจแƒ˜. JavaScript-แƒจแƒ˜ แƒแƒ แƒ˜แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒกแƒแƒฎแƒ˜แƒก scope:

  • Global Scope - แƒ’แƒšแƒแƒ‘แƒแƒšแƒฃแƒ แƒ˜
  • Function Scope - แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก
  • Block Scope - แƒ‘แƒšแƒแƒ™แƒ˜แƒก (ES6+)

๐ŸŒ Global Scope

// Global Scope - แƒงแƒ•แƒ”แƒšแƒ’แƒแƒœ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜
let globalVar = "I'm global!";
var oldGlobal = "I'm also global!";

function showGlobal() {
    console.log(globalVar); // แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ
    console.log(oldGlobal); // แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ
}

showGlobal(); // "I'm global!" "I'm also global!"

๐Ÿ”ง Function Scope

function myFunction() {
    let functionVar = "I'm in function scope";
    var oldFunctionVar = "Me too!";
    
    console.log(functionVar); // แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก
    console.log(oldFunctionVar); // แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก
}

myFunction();

// console.log(functionVar); // Error! แƒแƒ  แƒแƒ แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜
// console.log(oldFunctionVar); // Error! แƒแƒ  แƒแƒ แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜

๐Ÿ“ฆ Block Scope (ES6+)

// Block Scope - let แƒ“แƒ const แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒแƒก
if (true) {
    let blockVar = "I'm in block scope";
    const blockConst = "Me too!";
    var oldVar = "I'm not!";
    
    console.log(blockVar); // แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก
    console.log(blockConst); // แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก
}

// console.log(blockVar); // Error!
// console.log(blockConst); // Error!
console.log(oldVar); // แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก! var แƒแƒ  แƒ˜แƒชแƒœแƒแƒ‘แƒก block scope-แƒก

// for loop-แƒจแƒ˜ block scope
for (let i = 0; i < 3; i++) {
    console.log(i); // 0, 1, 2
}
// console.log(i); // Error!
๐Ÿ’ก แƒ แƒฉแƒ”แƒ•แƒ: แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— let แƒ“แƒ const var-แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“!

๐Ÿ”— Lexical Scope & Scope Chain

Lexical Scope

Lexical Scope แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก scope แƒ’แƒแƒœแƒ˜แƒกแƒแƒ–แƒฆแƒ•แƒ แƒ”แƒ‘แƒ แƒ˜แƒฅ, แƒกแƒแƒ“แƒแƒช แƒ˜แƒก แƒแƒ แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒšแƒ˜ แƒ™แƒแƒ“แƒจแƒ˜, แƒแƒ แƒ แƒ˜แƒฅ แƒกแƒแƒ“แƒแƒช แƒ˜แƒซแƒแƒฎแƒ”แƒ‘แƒ.

let globalVar = "Global";

function outerFunction() {
    let outerVar = "Outer";
    
    function innerFunction() {
        let innerVar = "Inner";
        
        // แƒงแƒ•แƒ”แƒšแƒ แƒชแƒ•แƒšแƒแƒ“แƒ˜ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ
        console.log(innerVar);  // "Inner"
        console.log(outerVar);  // "Outer"
        console.log(globalVar); // "Global"
    }
    
    innerFunction();
    // console.log(innerVar); // Error! แƒแƒ  แƒแƒ แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜
}

outerFunction();

๐Ÿ”— Scope Chain

JavaScript แƒ”แƒซแƒ”แƒ‘แƒก แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒก Scope Chain-แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—: แƒฏแƒ”แƒ  แƒšแƒแƒ™แƒแƒšแƒฃแƒ  scope-แƒจแƒ˜, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ parent scope-แƒจแƒ˜ แƒ“แƒ แƒแƒกแƒ” แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ global scope-แƒ›แƒ“แƒ”.

let name = "Global Ana";

function level1() {
    let name = "Level1 Nino";
    
    function level2() {
        let name = "Level2 Mari";
        
        function level3() {
            // name-แƒก แƒแƒ  แƒแƒฅแƒ•แƒก แƒšแƒแƒ™แƒแƒšแƒฃแƒ แƒ˜ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒ”แƒ‘แƒ
            console.log(name); // "Level2 Mari" - แƒแƒฎแƒšแƒ scope-แƒ˜แƒ“แƒแƒœ
        }
        
        level3();
    }
    
    level2();
}

level1();

// แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ scope chain-แƒ–แƒ”
function findVariable() {
    // let searchVar = "local"; // แƒแƒ›แƒ˜แƒก แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜ แƒ’แƒแƒฃแƒ™แƒ”แƒ—แƒ”แƒ—
    
    function inner() {
        console.log(searchVar); // แƒ”แƒซแƒ”แƒ‘แƒก parent scope-แƒ”แƒ‘แƒจแƒ˜
    }
    
    inner();
}

let searchVar = "global";
findVariable(); // "global"
๐ŸŽฏ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜: JavaScript แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒแƒฎแƒšแƒ scope-แƒก. แƒ—แƒฃ แƒชแƒ•แƒšแƒแƒ“แƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” scope-แƒจแƒ˜, แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒแƒฎแƒšแƒ.

๐Ÿ“ฆ Closures

แƒ แƒ แƒแƒ แƒ˜แƒก Closure?

Closure แƒ”แƒก แƒแƒ แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒแƒฅแƒ•แƒก แƒฌแƒ•แƒ“แƒแƒ›แƒ แƒ—แƒแƒ•แƒ˜แƒก parent scope-แƒ˜แƒก แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ–แƒ”, แƒ›แƒแƒจแƒ˜แƒœแƒแƒช แƒ™แƒ˜ แƒ แƒแƒชแƒ parent แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒฃแƒ™แƒ•แƒ” แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ.

๐Ÿ”ฎ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜

function createCounter() {
    let count = 0; // private แƒชแƒ•แƒšแƒแƒ“แƒ˜
    
    return function() {
        count++; // แƒจแƒ˜แƒ“แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒแƒฎแƒกแƒแƒ•แƒก parent-แƒ˜แƒก แƒชแƒ•แƒšแƒแƒ“แƒก
        return count;
    };
}

const counter1 = createCounter();
const counter2 = createCounter();

console.log(counter1()); // 1
console.log(counter1()); // 2
console.log(counter2()); // 1 (แƒ’แƒแƒœแƒชแƒแƒšแƒ™แƒ”แƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ counter)
console.log(counter1()); // 3

๐Ÿ›ก๏ธ Private แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜

function createBankAccount(initialBalance) {
    let balance = initialBalance;
    
    return {
        deposit: function(amount) {
            balance += amount;
            return balance;
        },
        
        withdraw: function(amount) {
            if (amount <= balance) {
                balance -= amount;
                return balance;
            }
            return "แƒแƒ แƒแƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜ แƒ—แƒแƒœแƒฎแƒ";
        },
        
        getBalance: function() {
            return balance;
        }
    };
}

const myAccount = createBankAccount(1000);

console.log(myAccount.getBalance()); // 1000
console.log(myAccount.deposit(500));  // 1500
console.log(myAccount.withdraw(200)); // 1300

// balance-แƒ–แƒ” แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒฌแƒ•แƒ“แƒแƒ›แƒ แƒจแƒ”แƒฃแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ
// console.log(myAccount.balance); // undefined

๐Ÿ”„ Loop-แƒ”แƒ‘แƒจแƒ˜ Closures

// โŒ แƒแƒ แƒแƒกแƒฌแƒแƒ แƒ˜ แƒ’แƒ–แƒ (var-แƒ˜แƒ—)
console.log("แƒแƒ แƒแƒกแƒฌแƒแƒ แƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜:");
for (var i = 1; i <= 3; i++) {
    setTimeout(function() {
        console.log("var: " + i); // แƒงแƒ•แƒ”แƒšแƒ 4-แƒก แƒ“แƒแƒ‘แƒ”แƒญแƒ“แƒแƒ•แƒก
    }, 1000);
}

// โœ… แƒกแƒฌแƒแƒ แƒ˜ แƒ’แƒ–แƒ (let-แƒ˜แƒ—)
console.log("แƒกแƒฌแƒแƒ แƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜:");
for (let i = 1; i <= 3; i++) {
    setTimeout(function() {
        console.log("let: " + i); // 1, 2, 3-แƒก แƒ“แƒแƒ‘แƒ”แƒญแƒ“แƒแƒ•แƒก
    }, 1000);
}

// โœ… IIFE-แƒ˜แƒ— (Immediately Invoked Function Expression)
console.log("IIFE แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜:");
for (var i = 1; i <= 3; i++) {
    (function(index) {
        setTimeout(function() {
            console.log("IIFE: " + index); // 1, 2, 3-แƒก แƒ“แƒแƒ‘แƒ”แƒญแƒ“แƒแƒ•แƒก
        }, 1000);
    })(i);
}
๐Ÿ’ก Closures-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ:
โ€ข Private แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ
โ€ข Module Pattern
โ€ข Callback Functions
โ€ข Event Handlers

โœจ Rest & Spread Operators

Rest (...) Operator

Rest operator แƒแƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒก แƒ›แƒ แƒแƒ•แƒแƒš แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒก แƒ”แƒ แƒ— แƒ›แƒแƒกแƒ˜แƒ•แƒจแƒ˜. แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒจแƒ˜ แƒ“แƒ destructuring-แƒจแƒ˜.

Spread (...) Operator

Spread operator "แƒแƒจแƒšแƒ˜แƒก" แƒ›แƒแƒกแƒ˜แƒ•แƒก แƒแƒœ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒก แƒชแƒแƒšแƒ™แƒ”แƒฃแƒš แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒแƒ“.

๐Ÿ“ฅ Rest Parameters

// Rest parameters - แƒงแƒ•แƒ”แƒšแƒ argument-แƒ˜ แƒ›แƒแƒกแƒ˜แƒ•แƒจแƒ˜
function sum(...numbers) {
    console.log(numbers); // แƒ›แƒแƒกแƒ˜แƒ•แƒ˜แƒ
    return numbers.reduce((total, num) => total + num, 0);
}

console.log(sum(1, 2, 3, 4, 5)); // 15
console.log(sum(10, 20)); // 30

// Rest-แƒ˜ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ‘แƒแƒšแƒแƒจแƒ˜
function greetUsers(greeting, ...names) {
    return names.map(name => `${greeting}, ${name}!`);
}

console.log(greetUsers("Hello", "Ana", "Nino", "Mari"));
// ["Hello, Ana!", "Hello, Nino!", "Hello, Mari!"]

๐Ÿ“ค Spread Syntax

// Spread แƒ›แƒแƒกแƒ˜แƒ•แƒ”แƒ‘แƒ—แƒแƒœ
const numbers1 = [1, 2, 3];
const numbers2 = [4, 5, 6];

// แƒ›แƒแƒกแƒ˜แƒ•แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ”แƒ‘แƒ
const combined = [...numbers1, ...numbers2];
console.log(combined); // [1, 2, 3, 4, 5, 6]

// แƒ›แƒแƒกแƒ˜แƒ•แƒ˜แƒก แƒ™แƒแƒžแƒ˜แƒ แƒ”แƒ‘แƒ
const copied = [...numbers1];
console.log(copied); // [1, 2, 3]

// Math.max()-แƒ˜แƒ— แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ
console.log(Math.max(...numbers1)); // 3

// Spread แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ—แƒแƒœ (ES2018)
const person = { name: "Ana", age: 25 };
const address = { city: "Tbilisi", country: "Georgia" };

const fullInfo = { ...person, ...address, age: 26 };
console.log(fullInfo);
// { name: "Ana", age: 26, city: "Tbilisi", country: "Georgia" }

๐Ÿ”„ Rest vs Spread

// REST - แƒแƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒก
function processItems(...items) { // REST
    console.log("Items:", items);
    return items.length;
}

const myArray = [1, 2, 3, 4, 5];

// SPREAD - แƒแƒจแƒšแƒ˜แƒก
const count = processItems(...myArray); // SPREAD
console.log("Count:", count); // 5

// Array destructuring-แƒจแƒ˜ REST
const [first, second, ...rest] = myArray;
console.log("First:", first);   // 1
console.log("Second:", second); // 2
console.log("Rest:", rest);     // [3, 4, 5]

๐Ÿ“‹ Array Destructuring

Array Destructuring

Array Destructuring แƒ’แƒ•แƒแƒซแƒšแƒ”แƒ•แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ›แƒแƒกแƒ˜แƒ•แƒ˜แƒก แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜ แƒชแƒแƒšแƒ™แƒ”แƒฃแƒš แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒจแƒ˜ แƒ’แƒแƒ•แƒแƒœแƒแƒฌแƒ˜แƒšแƒแƒ— แƒ›แƒแƒ™แƒšแƒ” แƒ“แƒ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒกแƒ˜แƒœแƒขแƒแƒฅแƒกแƒ˜แƒ—.

๐ŸŽฏ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ

// แƒซแƒ•แƒ”แƒšแƒ˜ แƒ’แƒ–แƒ
const fruits = ["apple", "banana", "orange"];
const firstFruit = fruits[0];
const secondFruit = fruits[1];

// แƒแƒฎแƒแƒšแƒ˜ แƒ’แƒ–แƒ - Destructuring
const [first, second, third] = fruits;
console.log(first);  // "apple"
console.log(second); // "banana"
console.log(third);  // "orange"

// แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒ”แƒ‘แƒ
const [a, , c] = fruits; // banana-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒ”แƒ‘แƒ
console.log(a); // "apple"
console.log(c); // "orange"

๐ŸŽจ แƒ›แƒแƒฌแƒ˜แƒœแƒแƒ•แƒ” แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒ”แƒ‘แƒ˜

// Default values
const colors = ["red"];
const [primary, secondary = "blue"] = colors;
console.log(primary);   // "red"
console.log(secondary); // "blue" (default)

// Rest operator-แƒ˜แƒ—
const numbers = [1, 2, 3, 4, 5];
const [head, ...tail] = numbers;
console.log(head); // 1
console.log(tail); // [2, 3, 4, 5]

// แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ (Swapping)
let x = 10;
let y = 20;
[x, y] = [y, x];
console.log(x); // 20
console.log(y); // 10

๐Ÿ”ง แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ—แƒแƒœ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ

// แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒ แƒแƒช แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒ›แƒแƒกแƒ˜แƒ•แƒก
function getCoordinates() {
    return [42.0, 43.0];
}

const [latitude, longitude] = getCoordinates();
console.log(`Lat: ${latitude}, Lng: ${longitude}`);

// แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ
function calculate(a, b) {
    return [a + b, a - b, a * b, a / b];
}

const [sum, difference, product, quotient] = calculate(10, 2);
console.log(`Sum: ${sum}, Difference: ${difference}, Product: ${product}, Quotient: ${quotient}`);
๐Ÿš€ แƒ แƒ”แƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜:
โ€ข API responses-แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ
โ€ข React state hooks-แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ
โ€ข Loop-แƒ”แƒ‘แƒจแƒ˜ index แƒ“แƒ value แƒ”แƒ แƒ—แƒแƒ“ แƒแƒฆแƒ”แƒ‘แƒ
โ€ข แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ

๐Ÿ”„ Object Destructuring

Object Destructuring

Object Destructuring แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒ•แƒแƒซแƒšแƒ”แƒ•แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก properties แƒชแƒแƒšแƒ™แƒ”แƒฃแƒš แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒจแƒ˜ แƒแƒ•แƒ˜แƒฆแƒแƒ—. แƒ”แƒก แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒ˜แƒ— แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒแƒ API responses แƒ“แƒ complex objects-แƒ”แƒ‘แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒแƒก.

๐ŸŽฏ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ


// แƒซแƒ•แƒ”แƒšแƒ˜ แƒ’แƒ–แƒ
const person = {
    name: "Ana",
    age: 25,
    city: "Tbilisi",
    profession: "Developer"
};

const name = person.name;
const age = person.age;

// แƒแƒฎแƒแƒšแƒ˜ แƒ’แƒ–แƒ - Destructuring
const { name, age, city } = person;
console.log(name); // "Ana"
console.log(age);  // 25
console.log(city); // "Tbilisi"

// แƒชแƒ•แƒšแƒแƒ“แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ
const { name: fullName, profession: job } = person;
console.log(fullName); // "Ana"
console.log(job);      // "Developer"

๐ŸŽจ แƒ›แƒแƒฌแƒ˜แƒœแƒแƒ•แƒ” แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒ”แƒ‘แƒ˜

// Default values
const settings = { theme: "dark" };
const { theme, language = "Georgian", fontSize = 16 } = settings;

console.log(theme);    // "dark"
console.log(language); // "Georgian" (default)
console.log(fontSize); // 16 (default)

// Nested objects
const user = {
    name: "Nino",
    address: {
        street: "Rustaveli Ave",
        city: "Tbilisi",
        country: "Georgia"
    },
    hobbies: ["reading", "coding"]
};

const { 
    name: userName, 
    address: { city: userCity, country },
    hobbies: [firstHobby]
} = user;

console.log(userName);   // "Nino"
console.log(userCity);   // "Tbilisi"
console.log(country);    // "Georgia"
console.log(firstHobby); // "reading"

๐Ÿ”ง แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒจแƒ˜ Destructuring

// Function parameters destructuring
function displayUser({ name, age, city = "Unknown" }) {
    console.log(`Name: ${name}`);
    console.log(`Age: ${age}`);
    console.log(`City: ${city}`);
}

const userData = { name: "Mari", age: 30, city: "Batumi" };
displayUser(userData);

// API response example
function processApiResponse({ data, status, message = "Success" }) {
    if (status === "success") {
        return data;
    }
    throw new Error(message);
}

// Rest in object destructuring
const config = {
    host: "localhost",
    port: 3000,
    ssl: true,
    debug: false,
    timeout: 5000
};

const { host, port, ...options } = config;
console.log(host);    // "localhost"
console.log(port);    // 3000
console.log(options); // { ssl: true, debug: false, timeout: 5000 }
๐Ÿš€ แƒ แƒ”แƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜:
โ€ข API responses-แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ
โ€ข React props-แƒ”แƒ‘แƒ˜แƒก destructuring
โ€ข Configuration objects
โ€ข Module imports

๐Ÿ“ ES6 Modules

ES6 Modules

Modules แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒ•แƒแƒซแƒšแƒ”แƒ•แƒก แƒ™แƒแƒ“แƒ˜ แƒ“แƒแƒ•แƒงแƒแƒ— แƒชแƒแƒšแƒ™แƒ”แƒฃแƒš แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒจแƒ˜ แƒ“แƒ แƒ›แƒแƒ“แƒฃแƒšแƒ”แƒ‘แƒจแƒ˜. แƒ”แƒก แƒฎแƒ“แƒ˜แƒก แƒ™แƒแƒ“แƒก แƒฃแƒคแƒ แƒ แƒแƒ แƒ’แƒแƒœแƒ˜แƒ–แƒ”แƒ‘แƒฃแƒšแƒก, แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒ’แƒแƒ›แƒแƒกแƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ”แƒšแƒก แƒ“แƒ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒแƒ“ แƒกแƒแƒขแƒ”แƒกแƒขแƒแƒก.

๐Ÿ“ค Export - แƒ”แƒฅแƒกแƒžแƒแƒ แƒขแƒ˜

// math.js แƒคแƒแƒ˜แƒšแƒ˜
// Named exports
export const PI = 3.14159;

export function add(a, b) {
    return a + b;
}

export function multiply(a, b) {
    return a * b;
}

// แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“ export
const subtract = (a, b) => a - b;
const divide = (a, b) => a / b;

export { subtract, divide };

// Default export
export default function calculator(operation, a, b) {
    switch(operation) {
        case 'add': return add(a, b);
        case 'subtract': return subtract(a, b);
        case 'multiply': return multiply(a, b);
        case 'divide': return divide(a, b);
        default: return 0;
    }
}

๐Ÿ“ฅ Import - แƒ˜แƒ›แƒžแƒแƒ แƒขแƒ˜

// main.js แƒคแƒแƒ˜แƒšแƒ˜
// Named imports
import { PI, add, multiply } from './math.js';

console.log(PI); // 3.14159
console.log(add(5, 3)); // 8

// Default import
import calculator from './math.js';
console.log(calculator('multiply', 4, 5)); // 20

// Import all as namespace
import * as MathUtils from './math.js';
console.log(MathUtils.PI); // 3.14159
console.log(MathUtils.add(2, 3)); // 5

// Import with alias
import { subtract as minus, divide as div } from './math.js';
console.log(minus(10, 3)); // 7

// Mixed imports
import calculator, { PI, add } from './math.js';

๐ŸŒŸ แƒ แƒ”แƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜

// utils.js
export const formatDate = (date) => {
    return new Intl.DateTimeFormat('ka-GE').format(date);
};

export const capitalize = (str) => {
    return str.charAt(0).toUpperCase() + str.slice(1);
};

export class Logger {
    static log(message) {
        console.log(`[${new Date().toISOString()}] ${message}`);
    }
    
    static error(message) {
        console.error(`[ERROR] ${message}`);
    }
}

// config.js
export default {
    API_URL: 'https://api.example.com',
    TIMEOUT: 5000,
    VERSION: '1.0.0'
};

// app.js
import config from './config.js';
import { formatDate, capitalize, Logger } from './utils.js';

Logger.log('Application started');
console.log(`API URL: ${config.API_URL}`);
console.log(`Today: ${formatDate(new Date())}`);
console.log(capitalize('hello world')); // "Hello world"
โš ๏ธ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜:
โ€ข Modules แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ server-แƒ–แƒ” แƒแƒœ type="module"-แƒ˜แƒ—
โ€ข แƒคแƒแƒ˜แƒšแƒ˜แƒก extension (.js) แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ
โ€ข Modules แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก strict mode-แƒจแƒ˜แƒ

๐Ÿ’ป แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒฃแƒšแƒ˜ แƒ•แƒแƒ แƒฏแƒ˜แƒจแƒ”แƒ‘แƒ˜

๐ŸŽฏ แƒ•แƒแƒ แƒฏแƒ˜แƒจแƒ˜ 1: Function Types

แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ: แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒ”แƒ แƒ—แƒ˜ แƒ“แƒ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒกแƒแƒ›แƒ˜แƒ•แƒ” แƒกแƒขแƒ˜แƒšแƒจแƒ˜:

  • Function Declaration
  • Function Expression
  • Arrow Function

แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒฃแƒœแƒ“แƒ แƒ˜แƒฆแƒ”แƒ‘แƒ“แƒ”แƒก แƒกแƒแƒฎแƒ”แƒšแƒก แƒ“แƒ แƒแƒกแƒแƒ™แƒก, แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒแƒก แƒ›แƒ˜แƒกแƒแƒšแƒ›แƒ”แƒ‘แƒ˜แƒก แƒขแƒ”แƒฅแƒกแƒขแƒ˜.

๐Ÿ” แƒ•แƒแƒ แƒฏแƒ˜แƒจแƒ˜ 2: Closure Bank Account

แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ: แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— bank account closure แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒ”แƒฅแƒœแƒ”แƒ‘แƒ:

  • deposit() - แƒ—แƒแƒœแƒฎแƒ˜แƒก แƒจแƒ”แƒขแƒแƒœแƒ
  • withdraw() - แƒ—แƒแƒœแƒฎแƒ˜แƒก แƒ’แƒแƒ›แƒแƒขแƒแƒœแƒ (แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ— balance)
  • getBalance() - แƒ‘แƒแƒšแƒแƒœแƒกแƒ˜แƒก แƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ
  • getTransactionHistory() - แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ˜แƒกแƒขแƒแƒ แƒ˜แƒ
๐Ÿ“Š แƒ•แƒแƒ แƒฏแƒ˜แƒจแƒ˜ 3: Array & Object Destructuring

แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜แƒ:

const students = [
    { name: "Ana", grades: [85, 90, 78], city: "Tbilisi" },
    { name: "Nino", grades: [92, 88, 95], city: "Batumi" },
    { name: "Mari", grades: [78, 85, 82], city: "Kutaisi" }
];

แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ: Destructuring-แƒ˜แƒ—:

  • แƒแƒ›แƒแƒ˜แƒฆแƒ”แƒ— แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒกแƒขแƒฃแƒ“แƒ”แƒœแƒขแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜ แƒ“แƒ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒฅแƒฃแƒšแƒ
  • แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒฆแƒ”แƒ‘แƒก student object-แƒก แƒ“แƒ แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก average แƒฅแƒฃแƒšแƒแƒก
๐Ÿ› ๏ธ แƒ•แƒแƒ แƒฏแƒ˜แƒจแƒ˜ 4: Rest & Spread

แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ: แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜:

  • findMinMax(...numbers) - แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒžแƒแƒขแƒแƒ แƒ แƒ“แƒ แƒ“แƒ˜แƒ“แƒ˜ แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜
  • mergeArrays(...arrays) - แƒ›แƒแƒกแƒ˜แƒ•แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ”แƒ‘แƒ
  • updateUser(user, updates) - spread-แƒ˜แƒ— user object-แƒ˜แƒก แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒ

๐ŸŽฏ แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒฌแƒ•แƒ”แƒ•แƒ”แƒ‘แƒ˜

๐Ÿ† Challenge 1: Smart Calculator Module

แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ: แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— calculator module แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช:

  • แƒ”แƒฅแƒกแƒžแƒแƒ แƒข แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜: add, subtract, multiply, divide
  • แƒแƒฅแƒ•แƒก history closure แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒงแƒ•แƒ”แƒšแƒ operation-แƒก
  • clearHistory() แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ
  • getHistory() แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ
// แƒ›แƒแƒกแƒแƒšแƒแƒ“แƒœแƒ”แƒšแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ:
import { add, getHistory, clearHistory } from './calculator.js';

console.log(add(5, 3)); // 8
console.log(getHistory()); // ["add(5, 3) = 8"]
๐ŸŽฎ Challenge 2: Game Score Manager

แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ: แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— game score manager:

const gameManager = createGameManager();

// แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜:
gameManager.addPlayer(name, initialScore = 0)
gameManager.updateScore(name, points)  // + แƒแƒœ - points
gameManager.getLeaderboard()          // แƒ“แƒแƒงแƒแƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒ˜แƒ
gameManager.getPlayerStats(name)      // destructuring-แƒ˜แƒ— แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒแƒก stats
๐ŸŒŸ Challenge 3: Utility Library

แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ: แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— utility library module:

  • deepClone(obj) - แƒฆแƒ แƒ›แƒ แƒ™แƒแƒžแƒ˜แƒ แƒ”แƒ‘แƒ
  • groupBy(array, key) - array-แƒ˜แƒก แƒ“แƒแƒฏแƒ’แƒฃแƒคแƒ”แƒ‘แƒ
  • debounce(func, delay) - debounce function
  • formatters - แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ formatter แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒ—

๐Ÿ“ แƒกแƒแƒฎแƒšแƒ˜แƒก แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ

๐Ÿ“š แƒ—แƒ”แƒแƒ แƒ˜แƒฃแƒšแƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒ˜

  • แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒฎแƒ”แƒš แƒ’แƒแƒ“แƒแƒฎแƒ”แƒ“แƒ”แƒ— แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒก
  • แƒจแƒ”แƒ˜แƒกแƒฌแƒแƒ•แƒšแƒ”แƒ— MDN documentation Closures-แƒ–แƒ”
  • แƒœแƒแƒฎแƒ”แƒ— 2-3 YouTube แƒ•แƒ˜แƒ“แƒ”แƒ ES6 Modules-แƒ–แƒ”
๐Ÿ  แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ 1: Shopping Cart Module

แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— shopping cart module แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒœแƒแƒšแƒ˜แƒ—:

// cart.js - ES6 module
// แƒ›แƒแƒกแƒแƒšแƒแƒ“แƒœแƒ”แƒšแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ:
import ShoppingCart from './cart.js';

const cart = new ShoppingCart();

cart.addItem({ id: 1, name: "Laptop", price: 1200, quantity: 1 });
cart.addItem({ id: 2, name: "Mouse", price: 25, quantity: 2 });

console.log(cart.getTotal()); // 1250
console.log(cart.getItemCount()); // 3
cart.removeItem(1);
console.log(cart.getCart()); // แƒ“แƒแƒ แƒฉแƒ”แƒœแƒ˜แƒšแƒ˜ items

แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜:

  • แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— ES6 Classes แƒ“แƒ Modules
  • private methods-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— Closures
  • แƒงแƒ•แƒ”แƒšแƒ method-แƒจแƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— Destructuring
  • validation-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— default parameters
๐Ÿ  แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ 2: Data Processing Pipeline

แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— data processing module:

// แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜ data
const rawData = [
    "Ana Beridze,25,Tbilisi,Developer,3500",
    "Nino Kapanadze,30,Batumi,Designer,2800",
    "Mari Gelashvili,28,Kutaisi,Manager,4200"
];

// แƒ›แƒแƒกแƒแƒšแƒแƒ“แƒœแƒ”แƒšแƒ˜ แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜:
[
    { name: "Ana", surname: "Beridze", age: 25, city: "Tbilisi", 
      position: "Developer", salary: 3500 },
    // ...
]

แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒ แƒแƒช แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ—:

  • parseData(rawData) - string array-แƒก object array-แƒจแƒ˜ แƒ’แƒแƒ แƒ“แƒแƒฅแƒ›แƒœแƒ
  • filterByCity(...cities) - rest parameter-แƒ˜แƒ— แƒคแƒ˜แƒšแƒขแƒ แƒแƒชแƒ˜แƒ
  • sortBySalary(ascending = true) - default parameter
  • getStatistics() - average salary, cities count, etc.
๐Ÿ“… แƒฉแƒแƒ‘แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ•แƒแƒ“แƒ: แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒกแƒ”แƒกแƒ˜แƒ˜แƒก แƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒแƒ›แƒ“แƒ”
๐Ÿ“‹ แƒฉแƒแƒ‘แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒคแƒแƒ แƒ›แƒ: GitHub repository link
๐Ÿ” แƒจแƒ”แƒคแƒแƒกแƒ”แƒ‘แƒ˜แƒก แƒ™แƒ แƒ˜แƒขแƒ”แƒ แƒ˜แƒฃแƒ›แƒ”แƒ‘แƒ˜: แƒ™แƒแƒ“แƒ˜แƒก แƒกแƒ˜แƒกแƒฃแƒคแƒ—แƒแƒ•แƒ”, ES6 features-แƒ˜แƒก แƒกแƒฌแƒแƒ แƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ, แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒœแƒแƒšแƒฃแƒ แƒแƒ‘แƒ

๐Ÿ“š แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜

๐Ÿ“– แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ

๐ŸŽฅ แƒ•แƒ˜แƒ“แƒ”แƒ แƒ›แƒแƒกแƒแƒšแƒ”แƒ‘แƒ˜

  • JavaScript Closures Explained
  • ES6 Destructuring Tutorial
  • Arrow Functions vs Regular Functions
  • JavaScript Modules Complete Guide

๐Ÿ“ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ›แƒแƒกแƒแƒšแƒ”แƒ‘แƒ˜

  • ES6 Features Cheat Sheet
  • Scope and Closures - You Don't Know JS
  • JavaScript Design Patterns
  • Clean Code in JavaScript

๐ŸŽ‰ แƒฅแƒ•แƒ˜แƒ–แƒ˜

๐Ÿ“‹ แƒฅแƒ•แƒ˜แƒ–แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ

แƒฅแƒ•แƒ˜แƒ–แƒ˜ แƒจแƒ”แƒ“แƒ’แƒ”แƒ‘แƒ 15 แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒกแƒ’แƒแƒœ แƒ“แƒ แƒ›แƒแƒ˜แƒชแƒแƒ•แƒก แƒงแƒ•แƒ”แƒšแƒ แƒ—แƒ”แƒ›แƒแƒก แƒ แƒแƒช แƒ“แƒฆแƒ”แƒก แƒจแƒ”แƒ˜แƒกแƒฌแƒแƒ•แƒšแƒ”แƒ—. แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒ™แƒ˜แƒ—แƒฎแƒ•แƒแƒก แƒแƒฅแƒ•แƒก 4 แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜ แƒžแƒแƒกแƒฃแƒฎแƒ˜.

โ“ แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜:

1. แƒ แƒ แƒแƒ แƒ˜แƒก Closure JavaScript-แƒจแƒ˜?

  • a) แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒฎแƒฃแƒ แƒ”แƒ‘แƒ
  • b) แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒแƒฅแƒ•แƒก แƒฌแƒ•แƒ“แƒแƒ›แƒ parent scope-แƒ–แƒ”
  • c) แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ  แƒ˜แƒฆแƒ”แƒ‘แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒก
  • d) แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก boolean-แƒก

2. แƒ แƒ แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒแƒ› แƒ™แƒแƒ“แƒ˜แƒก?

const [a, , c] = [1, 2, 3, 4];
console.log(a, c);
  • a) 1 2
  • b) 1 3
  • c) 1 4
  • d) Error

3. Rest operator (...) แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ:

  • a) แƒ›แƒฎแƒแƒšแƒแƒ“ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒจแƒ˜
  • b) แƒ›แƒฎแƒแƒšแƒแƒ“ array destructuring-แƒจแƒ˜
  • c) แƒแƒ แƒ˜แƒ•แƒ”แƒจแƒ˜ - แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒจแƒ˜แƒช แƒ“แƒ destructuring-แƒจแƒ˜แƒช
  • d) แƒ›แƒฎแƒแƒšแƒแƒ“ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ—แƒแƒœ
๐Ÿ† แƒฅแƒ•แƒ˜แƒ–แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ˜:
โ€ข 90-100% - แƒจแƒ”แƒกแƒแƒœแƒ˜แƒจแƒœแƒแƒ•แƒ˜!
โ€ข 70-89% - แƒ™แƒแƒ แƒ’แƒ˜ แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜
โ€ข 50-69% - แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒจแƒ”แƒกแƒฌแƒแƒ•แƒšแƒ
โ€ข <50% - แƒ’แƒแƒ•แƒ˜แƒ›แƒ”แƒแƒ แƒแƒ— แƒ›แƒแƒกแƒแƒšแƒ