JavaScript ๊ธฐ์ดˆ

JavaScript ๊ธฐ์ดˆ

๊ฐœ์š”

JavaScript๋Š” ์›น ํŽ˜์ด์ง€์— ๋™์ ์ธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. HTML์ด ๊ตฌ์กฐ, CSS๊ฐ€ ์Šคํƒ€์ผ์ด๋ผ๋ฉด, JavaScript๋Š” ๋™์ž‘์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์„ ์ˆ˜ ์ง€์‹: HTML, CSS ๊ธฐ์ดˆ


๋ชฉ์ฐจ

  1. JavaScript ์‹œ์ž‘ํ•˜๊ธฐ
  2. ๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜
  3. ์ž๋ฃŒํ˜•
  4. ์—ฐ์‚ฐ์ž
  5. ์กฐ๊ฑด๋ฌธ
  6. ๋ฐ˜๋ณต๋ฌธ
  7. ํ•จ์ˆ˜
  8. ๋ฐฐ์—ด
  9. ๊ฐ์ฒด
  10. ES6+ ๋ฌธ๋ฒ•

JavaScript ์‹œ์ž‘ํ•˜๊ธฐ

HTML์—์„œ JavaScript ์‚ฌ์šฉํ•˜๊ธฐ

<!-- ๋ฐฉ๋ฒ• 1: ๋‚ด๋ถ€ ์Šคํฌ๋ฆฝํŠธ -->
<script>
    console.log('Hello, World!');
</script>

<!-- ๋ฐฉ๋ฒ• 2: ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ (๊ถŒ์žฅ) -->
<script src="main.js"></script>

<!-- ๋ฐฉ๋ฒ• 3: ์ธ๋ผ์ธ ์ด๋ฒคํŠธ (๋น„๊ถŒ์žฅ) -->
<button onclick="alert('ํด๋ฆญ!')">ํด๋ฆญ</button>

์Šคํฌ๋ฆฝํŠธ ์œ„์น˜

<!DOCTYPE html>
<html>
<head>
    <!-- head์— ๋„ฃ์œผ๋ฉด HTML ํŒŒ์‹ฑ ์ฐจ๋‹จ -->
    <script src="blocking.js"></script>

    <!-- defer: HTML ํŒŒ์‹ฑ ์™„๋ฃŒ ํ›„ ์‹คํ–‰ -->
    <script src="main.js" defer></script>

    <!-- async: ๋‹ค์šด๋กœ๋“œ ์™„๋ฃŒ ์ฆ‰์‹œ ์‹คํ–‰ (์ˆœ์„œ ๋ณด์žฅ X) -->
    <script src="analytics.js" async></script>
</head>
<body>
    <h1>Hello</h1>

    <!-- body ๋์— ๋„ฃ์œผ๋ฉด DOM ์ค€๋น„ ํ›„ ์‹คํ–‰ -->
    <script src="main.js"></script>
</body>
</html>
์†์„ฑ ์‹คํ–‰ ์‹œ์  ์ˆœ์„œ ๋ณด์žฅ ์šฉ๋„
(์—†์Œ) ์ฆ‰์‹œ O -
defer DOM ํŒŒ์‹ฑ ํ›„ O ์ผ๋ฐ˜ ์Šคํฌ๋ฆฝํŠธ
async ๋‹ค์šด๋กœ๋“œ ํ›„ X ๋ถ„์„, ๊ด‘๊ณ 

๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์ฝ˜์†”

๋ธŒ๋ผ์šฐ์ €์—์„œ F12 โ†’ Console ํƒญ์—์„œ JavaScript๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

console.log('์ผ๋ฐ˜ ์ถœ๋ ฅ');
console.warn('๊ฒฝ๊ณ ');
console.error('์—๋Ÿฌ');
console.table([{a: 1}, {a: 2}]);  // ํ‘œ ํ˜•ํƒœ

๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜

let (๋ณ€์ˆ˜)

๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let name = 'ํ™๊ธธ๋™';
name = '๊น€์ฒ ์ˆ˜';  // ์žฌํ• ๋‹น ๊ฐ€๋Šฅ

let count;        // ์„ ์–ธ๋งŒ (undefined)
count = 0;        // ๋‚˜์ค‘์— ํ• ๋‹น

const (์ƒ์ˆ˜)

๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

const PI = 3.14159;
// PI = 3.14;  // ์—๋Ÿฌ! ์žฌํ• ๋‹น ๋ถˆ๊ฐ€

const user = { name: 'ํ™๊ธธ๋™' };
user.name = '๊น€์ฒ ์ˆ˜';  // ๊ฐ์ฒด ๋‚ด๋ถ€ ์†์„ฑ์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
// user = {};          // ์—๋Ÿฌ! ๊ฐ์ฒด ์ž์ฒด ์žฌํ• ๋‹น ๋ถˆ๊ฐ€

var (๋ ˆ๊ฑฐ์‹œ, ์‚ฌ์šฉ ์ง€์–‘)

var old = '์˜ค๋ž˜๋œ ๋ฐฉ์‹';  // ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„, ํ˜ธ์ด์ŠคํŒ… ๋ฌธ์ œ

๋ณ€์ˆ˜ ๋ช…๋ช… ๊ทœ์น™

// ์‚ฌ์šฉ ๊ฐ€๋Šฅ
let userName = 'kim';      // camelCase (๊ถŒ์žฅ)
let user_name = 'kim';     // snake_case
let _private = 'secret';   // ์–ธ๋”์Šค์ฝ”์–ด ์‹œ์ž‘
let $element = 'dom';      // ๋‹ฌ๋Ÿฌ ์‹œ์ž‘
let ํ•œ๊ธ€๋ณ€์ˆ˜ = '๊ฐ€๋Šฅ';       // ์œ ๋‹ˆ์ฝ”๋“œ (๋น„๊ถŒ์žฅ)

// ์‚ฌ์šฉ ๋ถˆ๊ฐ€
// let 1name = 'x';        // ์ˆซ์ž๋กœ ์‹œ์ž‘ X
// let user-name = 'x';    // ํ•˜์ดํ”ˆ X
// let let = 'x';          // ์˜ˆ์•ฝ์–ด X

์Šค์ฝ”ํ”„

// ๋ธ”๋ก ์Šค์ฝ”ํ”„ (let, const)
{
    let blockVar = '๋ธ”๋ก ๋‚ด๋ถ€';
    const blockConst = '๋ธ”๋ก ๋‚ด๋ถ€';
}
// console.log(blockVar);  // ์—๋Ÿฌ! ์ ‘๊ทผ ๋ถˆ๊ฐ€

// ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ (var)
function test() {
    var funcVar = 'ํ•จ์ˆ˜ ๋‚ด๋ถ€';
}
// console.log(funcVar);  // ์—๋Ÿฌ!

// ์ „์—ญ ์Šค์ฝ”ํ”„
let globalVar = '์–ด๋””์„œ๋“  ์ ‘๊ทผ ๊ฐ€๋Šฅ';

์ž๋ฃŒํ˜•

์›์‹œ ํƒ€์ž… (Primitive)

// String (๋ฌธ์ž์—ด)
let str1 = '์ž‘์€๋”ฐ์˜ดํ‘œ';
let str2 = "ํฐ๋”ฐ์˜ดํ‘œ";
let str3 = `ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด ${str1}`;

// Number (์ˆซ์ž)
let int = 42;
let float = 3.14;
let negative = -10;
let infinity = Infinity;
let notANumber = NaN;

// BigInt (ํฐ ์ •์ˆ˜)
let big = 9007199254740991n;

// Boolean (์ฐธ/๊ฑฐ์ง“)
let isTrue = true;
let isFalse = false;

// undefined (๊ฐ’ ์—†์Œ)
let nothing;
console.log(nothing);  // undefined

// null (์˜๋„์  ๋นˆ ๊ฐ’)
let empty = null;

// Symbol (๊ณ ์œ  ์‹๋ณ„์ž)
let sym = Symbol('description');

์ฐธ์กฐ ํƒ€์ž… (Reference)

// Object (๊ฐ์ฒด)
let obj = { name: 'ํ™๊ธธ๋™', age: 30 };

// Array (๋ฐฐ์—ด)
let arr = [1, 2, 3, 4, 5];

// Function (ํ•จ์ˆ˜)
let func = function() { return 'hello'; };

ํƒ€์ž… ํ™•์ธ

typeof 'hello'      // "string"
typeof 42           // "number"
typeof true         // "boolean"
typeof undefined    // "undefined"
typeof null         // "object" (์—ญ์‚ฌ์  ๋ฒ„๊ทธ)
typeof {}           // "object"
typeof []           // "object"
typeof function(){} // "function"

// ๋ฐฐ์—ด ํ™•์ธ
Array.isArray([1, 2, 3])  // true
Array.isArray({})          // false

ํƒ€์ž… ๋ณ€ํ™˜

// ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
String(123)        // "123"
(123).toString()   // "123"
123 + ''           // "123"

// ์ˆซ์ž๋กœ ๋ณ€ํ™˜
Number('123')      // 123
Number('abc')      // NaN
parseInt('42px')   // 42
parseFloat('3.14') // 3.14
+'123'             // 123

// ๋ถˆ๋ฆฌ์–ธ์œผ๋กœ ๋ณ€ํ™˜
Boolean(1)         // true
Boolean(0)         // false
Boolean('')        // false
Boolean('hello')   // true
!!1                // true

// Falsy ๊ฐ’ (false๋กœ ๋ณ€ํ™˜๋˜๋Š” ๊ฐ’)
// false, 0, -0, '', null, undefined, NaN

์—ฐ์‚ฐ์ž

์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž

10 + 3   // 13 (๋ง์…ˆ)
10 - 3   // 7  (๋บ„์…ˆ)
10 * 3   // 30 (๊ณฑ์…ˆ)
10 / 3   // 3.333... (๋‚˜๋ˆ—์…ˆ)
10 % 3   // 1  (๋‚˜๋จธ์ง€)
10 ** 3  // 1000 (๊ฑฐ๋“ญ์ œ๊ณฑ)

// ์ฆ๊ฐ ์—ฐ์‚ฐ์ž
let a = 5;
a++      // ํ›„์œ„: ์‚ฌ์šฉ ํ›„ ์ฆ๊ฐ€
++a      // ์ „์œ„: ์ฆ๊ฐ€ ํ›„ ์‚ฌ์šฉ
a--
--a

๋น„๊ต ์—ฐ์‚ฐ์ž

// ๋™๋“ฑ ๋น„๊ต (ํƒ€์ž… ๋ณ€ํ™˜ O)
5 == '5'    // true
0 == false  // true
null == undefined  // true

// ์ผ์น˜ ๋น„๊ต (ํƒ€์ž… ๋ณ€ํ™˜ X) - ๊ถŒ์žฅ!
5 === '5'   // false
0 === false // false

// ๋ถ€๋“ฑ ๋น„๊ต
5 != '5'    // false (ํƒ€์ž… ๋ณ€ํ™˜)
5 !== '5'   // true  (ํƒ€์ž… ๋น„๊ต)

// ํฌ๊ธฐ ๋น„๊ต
5 > 3       // true
5 >= 5      // true
5 < 3       // false
5 <= 5      // true

๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž

// AND (๋‘˜ ๋‹ค true๋ฉด true)
true && true    // true
true && false   // false

// OR (ํ•˜๋‚˜๋ผ๋„ true๋ฉด true)
true || false   // true
false || false  // false

// NOT (๋ฐ˜์ „)
!true           // false
!false          // true

// ๋‹จ๋ฝ ํ‰๊ฐ€ (Short-circuit)
const name = user && user.name;  // user๊ฐ€ ์—†์œผ๋ฉด undefined
const value = input || '๊ธฐ๋ณธ๊ฐ’';  // input์ด falsy๋ฉด '๊ธฐ๋ณธ๊ฐ’'

Nullish ์—ฐ์‚ฐ์ž

// ?? (null/undefined์ผ ๋•Œ๋งŒ ์šฐ์ธก ๊ฐ’)
null ?? '๊ธฐ๋ณธ๊ฐ’'      // '๊ธฐ๋ณธ๊ฐ’'
undefined ?? '๊ธฐ๋ณธ๊ฐ’' // '๊ธฐ๋ณธ๊ฐ’'
0 ?? '๊ธฐ๋ณธ๊ฐ’'         // 0
'' ?? '๊ธฐ๋ณธ๊ฐ’'        // ''

// || ์™€ ๋น„๊ต
0 || '๊ธฐ๋ณธ๊ฐ’'         // '๊ธฐ๋ณธ๊ฐ’' (0์€ falsy)
'' || '๊ธฐ๋ณธ๊ฐ’'        // '๊ธฐ๋ณธ๊ฐ’' (''์€ falsy)

ํ• ๋‹น ์—ฐ์‚ฐ์ž

let x = 10;
x += 5;   // x = x + 5  โ†’ 15
x -= 3;   // x = x - 3  โ†’ 12
x *= 2;   // x = x * 2  โ†’ 24
x /= 4;   // x = x / 4  โ†’ 6
x %= 4;   // x = x % 4  โ†’ 2
x **= 2;  // x = x ** 2 โ†’ 4

// ๋…ผ๋ฆฌ ํ• ๋‹น (ES2021)
x ||= 10;  // x = x || 10
x &&= 5;   // x = x && 5
x ??= 0;   // x = x ?? 0

์‚ผํ•ญ ์—ฐ์‚ฐ์ž

const result = ์กฐ๊ฑด ? ์ฐธ์ผ๋•Œ : ๊ฑฐ์ง“์ผ๋•Œ;

const age = 20;
const status = age >= 18 ? '์„ฑ์ธ' : '๋ฏธ์„ฑ๋…„';

// ์ค‘์ฒฉ (๊ฐ€๋…์„ฑ ์ฃผ์˜)
const grade = score >= 90 ? 'A'
            : score >= 80 ? 'B'
            : score >= 70 ? 'C'
            : 'F';

์กฐ๊ฑด๋ฌธ

if...else

const age = 20;

if (age >= 18) {
    console.log('์„ฑ์ธ');
} else if (age >= 13) {
    console.log('์ฒญ์†Œ๋…„');
} else {
    console.log('์–ด๋ฆฐ์ด');
}

switch

const day = '์›”';

switch (day) {
    case '์›”':
    case 'ํ™”':
    case '์ˆ˜':
    case '๋ชฉ':
    case '๊ธˆ':
        console.log('ํ‰์ผ');
        break;
    case 'ํ† ':
    case '์ผ':
        console.log('์ฃผ๋ง');
        break;
    default:
        console.log('์•Œ ์ˆ˜ ์—†์Œ');
}

์กฐ๊ฑด๋ถ€ ์‹คํ–‰

// ์กฐ๊ฑด && ์‹คํ–‰๋ฌธ
isLoggedIn && showDashboard();

// ์กฐ๊ฑด || ์‹คํ–‰๋ฌธ
data || fetchData();

๋ฐ˜๋ณต๋ฌธ

for

for (let i = 0; i < 5; i++) {
    console.log(i);  // 0, 1, 2, 3, 4
}

// ์—ญ์ˆœ
for (let i = 4; i >= 0; i--) {
    console.log(i);  // 4, 3, 2, 1, 0
}

for...of (๋ฐฐ์—ด)

const fruits = ['์‚ฌ๊ณผ', '๋ฐ”๋‚˜๋‚˜', '์˜ค๋ Œ์ง€'];

for (const fruit of fruits) {
    console.log(fruit);
}

for...in (๊ฐ์ฒด)

const user = { name: 'ํ™๊ธธ๋™', age: 30 };

for (const key in user) {
    console.log(key, user[key]);
    // name ํ™๊ธธ๋™
    // age 30
}

while

let count = 0;

while (count < 5) {
    console.log(count);
    count++;
}

do...while

let num = 0;

do {
    console.log(num);  // ์ตœ์†Œ 1๋ฒˆ์€ ์‹คํ–‰
    num++;
} while (num < 5);

break์™€ continue

// break: ๋ฐ˜๋ณต๋ฌธ ์ข…๋ฃŒ
for (let i = 0; i < 10; i++) {
    if (i === 5) break;
    console.log(i);  // 0, 1, 2, 3, 4
}

// continue: ํ˜„์žฌ ๋ฐ˜๋ณต ๊ฑด๋„ˆ๋›ฐ๊ธฐ
for (let i = 0; i < 5; i++) {
    if (i === 2) continue;
    console.log(i);  // 0, 1, 3, 4
}

ํ•จ์ˆ˜

ํ•จ์ˆ˜ ์„ ์–ธ์‹

function greet(name) {
    return `์•ˆ๋…•, ${name}!`;
}

greet('ํ™๊ธธ๋™');  // "์•ˆ๋…•, ํ™๊ธธ๋™!"

ํ•จ์ˆ˜ ํ‘œํ˜„์‹

const greet = function(name) {
    return `์•ˆ๋…•, ${name}!`;
};

greet('ํ™๊ธธ๋™');

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ (Arrow Function)

// ๊ธฐ๋ณธ ํ˜•ํƒœ
const greet = (name) => {
    return `์•ˆ๋…•, ${name}!`;
};

// ๋งค๊ฐœ๋ณ€์ˆ˜ 1๊ฐœ: ๊ด„ํ˜ธ ์ƒ๋žต ๊ฐ€๋Šฅ
const greet = name => {
    return `์•ˆ๋…•, ${name}!`;
};

// ํ•œ ์ค„์ด๋ฉด ์ค‘๊ด„ํ˜ธ์™€ return ์ƒ๋žต
const greet = name => `์•ˆ๋…•, ${name}!`;

// ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์Œ
const sayHello = () => '์•ˆ๋…•!';

// ๊ฐ์ฒด ๋ฐ˜ํ™˜ (๊ด„ํ˜ธ ํ•„์ˆ˜)
const createUser = name => ({ name, created: Date.now() });

๋งค๊ฐœ๋ณ€์ˆ˜

// ๊ธฐ๋ณธ๊ฐ’
function greet(name = '์†๋‹˜') {
    return `์•ˆ๋…•, ${name}!`;
}
greet();        // "์•ˆ๋…•, ์†๋‹˜!"
greet('์ฒ ์ˆ˜');  // "์•ˆ๋…•, ์ฒ ์ˆ˜!"

// ๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜
function sum(...numbers) {
    return numbers.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3, 4);  // 10

// ๊ตฌ์กฐ ๋ถ„ํ•ด
function printUser({ name, age }) {
    console.log(`${name}์€ ${age}์‚ด`);
}
printUser({ name: 'ํ™๊ธธ๋™', age: 30 });

์ฝœ๋ฐฑ ํ•จ์ˆ˜

function processData(data, callback) {
    // ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
    const result = data.toUpperCase();
    callback(result);
}

processData('hello', function(result) {
    console.log(result);  // "HELLO"
});

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ
processData('hello', result => console.log(result));

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ (IIFE)

(function() {
    const private = '์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€';
    console.log('์ฆ‰์‹œ ์‹คํ–‰');
})();

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
(() => {
    console.log('์ฆ‰์‹œ ์‹คํ–‰');
})();

๋ฐฐ์—ด

๋ฐฐ์—ด ์ƒ์„ฑ

// ๋ฆฌํ„ฐ๋Ÿด (๊ถŒ์žฅ)
const arr1 = [1, 2, 3];

// ์ƒ์„ฑ์ž
const arr2 = new Array(3);     // [empty ร— 3]
const arr3 = Array.of(1, 2, 3); // [1, 2, 3]
const arr4 = Array.from('abc'); // ['a', 'b', 'c']

๋ฐฐ์—ด ์ ‘๊ทผ

const fruits = ['์‚ฌ๊ณผ', '๋ฐ”๋‚˜๋‚˜', '์˜ค๋ Œ์ง€'];

fruits[0]          // '์‚ฌ๊ณผ'
fruits[2]          // '์˜ค๋ Œ์ง€'
fruits.length      // 3
fruits.at(-1)      // '์˜ค๋ Œ์ง€' (๋งˆ์ง€๋ง‰ ์š”์†Œ)
fruits.at(-2)      // '๋ฐ”๋‚˜๋‚˜'

๋ฐฐ์—ด ์ˆ˜์ •

const arr = [1, 2, 3];

// ์ถ”๊ฐ€
arr.push(4);         // ๋์— ์ถ”๊ฐ€: [1, 2, 3, 4]
arr.unshift(0);      // ์•ž์— ์ถ”๊ฐ€: [0, 1, 2, 3, 4]

// ์ œ๊ฑฐ
arr.pop();           // ๋์—์„œ ์ œ๊ฑฐ: [0, 1, 2, 3]
arr.shift();         // ์•ž์—์„œ ์ œ๊ฑฐ: [1, 2, 3]

// ํŠน์ • ์œ„์น˜ ์ˆ˜์ •
arr.splice(1, 1);           // ์ธ๋ฑ์Šค 1์—์„œ 1๊ฐœ ์ œ๊ฑฐ: [1, 3]
arr.splice(1, 0, 'a', 'b'); // ์ธ๋ฑ์Šค 1์— ์ถ”๊ฐ€: [1, 'a', 'b', 3]
arr.splice(1, 1, 'x');      // ์ธ๋ฑ์Šค 1์„ ๊ต์ฒด: [1, 'x', 'b', 3]

๋ฐฐ์—ด ๊ฒ€์ƒ‰

const arr = [1, 2, 3, 2, 1];

arr.indexOf(2)        // 1 (์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค)
arr.lastIndexOf(2)    // 3 (๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค)
arr.includes(2)       // true (ํฌํ•จ ์—ฌ๋ถ€)

// ์กฐ๊ฑด์œผ๋กœ ๊ฒ€์ƒ‰
const users = [
    { id: 1, name: 'Kim' },
    { id: 2, name: 'Lee' }
];

users.find(u => u.id === 1);       // { id: 1, name: 'Kim' }
users.findIndex(u => u.id === 1);  // 0

๋ฐฐ์—ด ๋ฐ˜๋ณต ๋ฉ”์„œ๋“œ

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

// forEach: ๊ฐ ์š”์†Œ ์‹คํ–‰ (๋ฐ˜ํ™˜๊ฐ’ ์—†์Œ)
numbers.forEach((num, index) => {
    console.log(index, num);
});

// map: ๋ณ€ํ™˜๋œ ์ƒˆ ๋ฐฐ์—ด ๋ฐ˜ํ™˜
const doubled = numbers.map(n => n * 2);
// [2, 4, 6, 8, 10]

// filter: ์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ๋งŒ
const evens = numbers.filter(n => n % 2 === 0);
// [2, 4]

// reduce: ๋ˆ„์  ๊ณ„์‚ฐ
const sum = numbers.reduce((acc, cur) => acc + cur, 0);
// 15

// every: ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์กฐ๊ฑด ์ถฉ์กฑ?
numbers.every(n => n > 0);  // true

// some: ํ•˜๋‚˜๋ผ๋„ ์กฐ๊ฑด ์ถฉ์กฑ?
numbers.some(n => n > 4);   // true

๋ฐฐ์—ด ์ •๋ ฌ

const arr = [3, 1, 4, 1, 5];

// ์˜ค๋ฆ„์ฐจ์ˆœ
arr.sort((a, b) => a - b);  // [1, 1, 3, 4, 5]

// ๋‚ด๋ฆผ์ฐจ์ˆœ
arr.sort((a, b) => b - a);  // [5, 4, 3, 1, 1]

// ๋ฌธ์ž์—ด ์ •๋ ฌ
const names = ['ํ™๊ธธ๋™', '๊น€์ฒ ์ˆ˜', '์ด์˜ํฌ'];
names.sort();               // ['๊น€์ฒ ์ˆ˜', '์ด์˜ํฌ', 'ํ™๊ธธ๋™']

// ์—ญ์ˆœ
arr.reverse();  // [1, 1, 4, 3, 5]

๋ฐฐ์—ด ๋ณ€ํ™˜

const arr = [1, 2, 3];

// ๋ณต์‚ฌ
const copy = [...arr];        // ์Šคํ”„๋ ˆ๋“œ
const copy2 = arr.slice();    // slice

// ํ•ฉ์น˜๊ธฐ
const merged = [...arr, ...[4, 5]];  // [1, 2, 3, 4, 5]
const merged2 = arr.concat([4, 5]);

// ํ‰ํƒ„ํ™”
const nested = [1, [2, [3, 4]]];
nested.flat();     // [1, 2, [3, 4]]
nested.flat(2);    // [1, 2, 3, 4]
nested.flat(Infinity);  // ์™„์ „ ํ‰ํƒ„ํ™”

// ๋ฌธ์ž์—ด๋กœ
[1, 2, 3].join('-');  // "1-2-3"

๊ฐ์ฒด

๊ฐ์ฒด ์ƒ์„ฑ

// ๋ฆฌํ„ฐ๋Ÿด (๊ถŒ์žฅ)
const user = {
    name: 'ํ™๊ธธ๋™',
    age: 30,
    email: 'hong@example.com'
};

// ์ƒ์„ฑ์ž
const obj = new Object();
obj.name = 'ํ™๊ธธ๋™';

๊ฐ์ฒด ์ ‘๊ทผ

const user = { name: 'ํ™๊ธธ๋™', age: 30 };

// ์  ํ‘œ๊ธฐ๋ฒ•
user.name       // 'ํ™๊ธธ๋™'
user.age        // 30

// ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ• (๋™์  ํ‚ค)
user['name']    // 'ํ™๊ธธ๋™'

const key = 'age';
user[key]       // 30

๊ฐ์ฒด ์ˆ˜์ •

const user = { name: 'ํ™๊ธธ๋™' };

// ์ถ”๊ฐ€/์ˆ˜์ •
user.age = 30;
user['email'] = 'hong@example.com';

// ์‚ญ์ œ
delete user.email;

// ์†์„ฑ ์กด์žฌ ํ™•์ธ
'name' in user           // true
user.hasOwnProperty('name')  // true

๊ฐ์ฒด ์ˆœํšŒ

const user = { name: 'ํ™๊ธธ๋™', age: 30 };

// for...in
for (const key in user) {
    console.log(key, user[key]);
}

// Object ๋ฉ”์„œ๋“œ
Object.keys(user)    // ['name', 'age']
Object.values(user)  // ['ํ™๊ธธ๋™', 30]
Object.entries(user) // [['name', 'ํ™๊ธธ๋™'], ['age', 30]]

// entries๋กœ ์ˆœํšŒ
for (const [key, value] of Object.entries(user)) {
    console.log(key, value);
}

๊ฐ์ฒด ๋ณต์‚ฌ/๋ณ‘ํ•ฉ

const user = { name: 'ํ™๊ธธ๋™', age: 30 };

// ์–•์€ ๋ณต์‚ฌ
const copy1 = { ...user };           // ์Šคํ”„๋ ˆ๋“œ
const copy2 = Object.assign({}, user);

// ๋ณ‘ํ•ฉ
const merged = { ...user, city: '์„œ์šธ' };
const merged2 = Object.assign({}, user, { city: '์„œ์šธ' });

// ๊นŠ์€ ๋ณต์‚ฌ (์ค‘์ฒฉ ๊ฐ์ฒด)
const deep = JSON.parse(JSON.stringify(user));
const deep2 = structuredClone(user);  // ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €

๋‹จ์ถ• ์†์„ฑ

const name = 'ํ™๊ธธ๋™';
const age = 30;

// ๊ธฐ์กด ๋ฐฉ์‹
const user1 = { name: name, age: age };

// ๋‹จ์ถ• ์†์„ฑ
const user2 = { name, age };

๊ณ„์‚ฐ๋œ ์†์„ฑ๋ช…

const key = 'email';
const user = {
    name: 'ํ™๊ธธ๋™',
    [key]: 'hong@example.com',
    ['get' + 'Age']() { return 30; }
};

user.email    // 'hong@example.com'
user.getAge() // 30

๋ฉ”์„œ๋“œ

const user = {
    name: 'ํ™๊ธธ๋™',

    // ๋ฉ”์„œ๋“œ
    greet() {
        return `์•ˆ๋…•, ${this.name}!`;
    },

    // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ (this ์ฃผ์˜!)
    // this๊ฐ€ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ์ฐธ์กฐ
    badGreet: () => {
        return `์•ˆ๋…•, ${this.name}!`;  // this๋Š” user๊ฐ€ ์•„๋‹˜!
    }
};

user.greet();  // "์•ˆ๋…•, ํ™๊ธธ๋™!"

ES6+ ๋ฌธ๋ฒ•

ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด

const name = 'ํ™๊ธธ๋™';
const age = 30;

// ๊ธฐ์กด ๋ฐฉ์‹
const msg1 = '์ด๋ฆ„: ' + name + ', ๋‚˜์ด: ' + age;

// ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด
const msg2 = `์ด๋ฆ„: ${name}, ๋‚˜์ด: ${age}`;

// ์—ฌ๋Ÿฌ ์ค„
const html = `
    <div>
        <h1>${name}</h1>
        <p>${age}์‚ด</p>
    </div>
`;

// ํ‘œํ˜„์‹ ์‚ฌ์šฉ
const result = `ํ•ฉ๊ณ„: ${10 + 20}`;
const status = `์ƒํƒœ: ${age >= 18 ? '์„ฑ์ธ' : '๋ฏธ์„ฑ๋…„'}`;

๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น

// ๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด
const [a, b, c] = [1, 2, 3];
const [first, , third] = [1, 2, 3];  // ๊ฑด๋„ˆ๋›ฐ๊ธฐ
const [x, ...rest] = [1, 2, 3, 4];   // ๋‚˜๋จธ์ง€

// ๊ฐ์ฒด ๊ตฌ์กฐ ๋ถ„ํ•ด
const { name, age } = { name: 'ํ™๊ธธ๋™', age: 30 };

// ๊ธฐ๋ณธ๊ฐ’
const { name, city = '์„œ์šธ' } = { name: 'ํ™๊ธธ๋™' };

// ์ด๋ฆ„ ๋ณ€๊ฒฝ
const { name: userName, age: userAge } = user;

// ์ค‘์ฒฉ
const { address: { city } } = {
    address: { city: '์„œ์šธ' }
};

// ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜
function greet({ name, age = 0 }) {
    console.log(`${name}, ${age}์‚ด`);
}

์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž

// ๋ฐฐ์—ด
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];  // [1, 2, 3, 4, 5]

// ๊ฐ์ฒด
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 };  // { a: 1, b: 2, c: 3 }

// ํ•จ์ˆ˜ ํ˜ธ์ถœ
const numbers = [1, 2, 3];
Math.max(...numbers);  // 3

// ๋ฌธ์ž์—ด โ†’ ๋ฐฐ์—ด
[...'hello']  // ['h', 'e', 'l', 'l', 'o']

Optional Chaining (?.)

const user = {
    name: 'ํ™๊ธธ๋™',
    address: {
        city: '์„œ์šธ'
    }
};

// ๊ธฐ์กด ๋ฐฉ์‹
const city1 = user && user.address && user.address.city;

// Optional Chaining
const city2 = user?.address?.city;

// ๋ฐฐ์—ด
const first = arr?.[0];

// ํ•จ์ˆ˜
const result = obj.method?.();

Nullish Coalescing (??)

// || ์™€ ๋‹ค๋ฅด๊ฒŒ null/undefined๋งŒ ์ฒดํฌ
const value1 = null ?? '๊ธฐ๋ณธ๊ฐ’';     // '๊ธฐ๋ณธ๊ฐ’'
const value2 = undefined ?? '๊ธฐ๋ณธ๊ฐ’'; // '๊ธฐ๋ณธ๊ฐ’'
const value3 = 0 ?? '๊ธฐ๋ณธ๊ฐ’';        // 0
const value4 = '' ?? '๊ธฐ๋ณธ๊ฐ’';       // ''
const value5 = false ?? '๊ธฐ๋ณธ๊ฐ’';    // false

์—ฐ์Šต ๋ฌธ์ œ

๋ฌธ์ œ 1: ๋ณ€์ˆ˜์™€ ์กฐ๊ฑด๋ฌธ

๋‚˜์ด๋ฅผ ๋ฐ›์•„ ๊ตฌ๋ถ„ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”. - 0-12: "์–ด๋ฆฐ์ด" - 13-19: "์ฒญ์†Œ๋…„" - 20-64: "์„ฑ์ธ" - 65+: "๋…ธ์ธ"

์ •๋‹ต ๋ณด๊ธฐ
function getAgeGroup(age) {
    if (age < 0) return '์ž˜๋ชป๋œ ๋‚˜์ด';
    if (age <= 12) return '์–ด๋ฆฐ์ด';
    if (age <= 19) return '์ฒญ์†Œ๋…„';
    if (age <= 64) return '์„ฑ์ธ';
    return '๋…ธ์ธ';
}

๋ฌธ์ œ 2: ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ

์ˆซ์ž ๋ฐฐ์—ด์—์„œ ์ง์ˆ˜๋งŒ ๊ณจ๋ผ ์ œ๊ณฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”.

// ์ž…๋ ฅ: [1, 2, 3, 4, 5, 6]
// ์ถœ๋ ฅ: [4, 16, 36]
์ •๋‹ต ๋ณด๊ธฐ
const numbers = [1, 2, 3, 4, 5, 6];

const result = numbers
    .filter(n => n % 2 === 0)
    .map(n => n ** 2);

console.log(result);  // [4, 16, 36]

๋ฌธ์ œ 3: ๊ฐ์ฒด ๋‹ค๋ฃจ๊ธฐ

์‚ฌ์šฉ์ž ๋ฐฐ์—ด์—์„œ ํŠน์ • ์กฐ๊ฑด์˜ ์‚ฌ์šฉ์ž๋ฅผ ์ฐพ๊ณ  ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜์„ธ์š”.

const users = [
    { id: 1, name: 'Kim', age: 25 },
    { id: 2, name: 'Lee', age: 30 },
    { id: 3, name: 'Park', age: 28 }
];
// ๋‚˜์ด๊ฐ€ 28 ์ด์ƒ์ธ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„๋งŒ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
์ •๋‹ต ๋ณด๊ธฐ
const result = users
    .filter(user => user.age >= 28)
    .map(user => user.name);

console.log(result);  // ['Lee', 'Park']

๋‹ค์Œ ๋‹จ๊ณ„

  • 07_JS_Events_DOM.md - DOM ์กฐ์ž‘๊ณผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง

์ฐธ๊ณ  ์ž๋ฃŒ

to navigate between lessons