Front-End/Javascript

JavaScript ํ•ต์‹ฌ์š”์•ฝ

์ฑ”๐Ÿป 2024. 1. 25. 12:05

1.2 ์ถœ๋ ฅ๊ณผ ์ž…๋ ฅ

์ถœ๋ ฅ

window : ๋ธŒ๋ผ์šฐ์ €

document : ๋ธŒ๋ผ์šฐ์ €์— ๋กœ๋”ฉ๋œ html

  • window.alert(์ถœ๋ ฅํ•  ๋‚ด์šฉ) : ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฒฝ๊ณ ์ฐฝ์— ์ถœ๋ ฅ
  • console.log(์ถœ๋ ฅํ•  ๋‚ด์šฉ) : ๋ธŒ๋ผ์šฐ์ €์˜ ์ฝ˜์†”์— ์ถœ๋ ฅ
  • document.write()
    • ๊ธฐ์กด ๋‚ด์šฉ์„ ๋‹ค ์‚ญ์ œํ•˜๊ณ  ์ž…๋ ฅํ•œ๋‹ค.
    • ๋ฌธ์„œ๋ฅผ ์•„์˜ˆ ์ƒˆ๋กœ ๋งŒ๋“ค ๋•Œ๋งŒ ์‚ฌ์šฉ. ํ•จ๋ถ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋จ. ๊ฑฐ์˜ ์‚ฌ์šฉํ•  ์ผ X
  • innerHTML
    $0
    <h1>Hello</h1>
    $0.innerHTML
    'Hello'
    $0.innerHTML = 'World';
    'World'
    $0.innerHTML = '<span>Hi</span>' // h1 ํƒœ๊ทธ inner์— span ํƒœ๊ทธ ์‚ฝ์ž…
    '<span>Hi</span>'
  • textContent
    $0.textContent = '<span>Hi</span>' // $0(h1ํƒœ๊ทธ)์˜ ๋‚ด์šฉ์„ <span>Hi</span>๋กœ ๋ฐ”๊พผ๋‹ค.
    '<span>Hi</span>'

    • innerHTML๊ณผ textContent์˜ ์ฐจ์ด

      textContent๋Š” innerHTML๊ณผ ๋‹ฌ๋ฆฌ ํƒœ๊ทธ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ธ์‹ํ•œ๋‹ค.

์ž…๋ ฅ

  • window.confrim(๋ฉ”์‹œ์ง€)

    ํ™•์ธ์ฐฝ ์ž…๋ ฅ ์˜ˆ โ†’ true, ์•„๋‹ˆ์˜ค โ†’ false

  • window.prompt(โ€์ œ๋ชฉโ€, โ€œ๋‚ด์šฉโ€)

    ์ž…๋ ฅํ•œ ๋‚ด์šฉ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜

1.3 ์ž๋ฃŒํ˜•(Data Types)

  • typeof ์—ฐ์‚ฐ์ž๋กœ ๋ณ€์ˆ˜๋‚˜ ๋ฆฌํ„ฐ๋Ÿด์˜ ํƒ€์ž… ํ™•์ธ ๊ฐ€๋Šฅ

    ๊ฐ์ฒด์˜ typeof โ†’ obejct

    +) ๊ฐ์ฒด์˜ ํƒ€์ž… ํ™•์ธ ์‹œ instanceof ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ

    typeof 1 // 'number'
    typeof 'abc' // 'string'
    typeof [] // 'object'
    typeof function() {} // 'function'
  • true๋กœ ํ‰๊ฐ€๋˜๋Š” ๊ฐ’ : false๊ฐ€ ์•„๋‹Œ ๊ฐ’ ์ „๋ถ€

    false๋กœ ํ‰๊ฐ€๋˜๋Š” ๊ฐ’ : 0, -0, โ€œโ€, null, false, NaN, undefined

    โ€ป !! ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ false๋ผ๋ฉด, false๋กœ ํ‰๊ฐ€๋˜๋Š” ๊ฐ’์ด๋‹ค.

    !!1 // true
    !!0 // false
    !! [] // true ๋นˆ ๋ฐฐ์—ด
    !! {} // true ๋นˆ ๊ฐ์ฒด
    !!'0' // false์ผ ๊ฒƒ ๊ฐ™์ง€๋งŒ true์ด๋‹ค.
  • null VS undefined

    null์€ ์ฐธ์กฐ๋ณ€์ˆ˜์— ๋„ฃ๋Š” ๊ฒƒ. ์ฐธ์กฐํ˜•์ž„ undefined์€ ???(์ฐธ์กฐ๊ฐ€๋ ์ง€ ๊ธฐ๋ณธ์ด ๋ ์ง€ ๋ชจ๋ฆ„)

    ๋Œ€๋ถ€๋ถ„ undefined๋‹ค.

1.5 ํ˜ธ์ด์ŠคํŒ…(hoisting)

  • ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ์„ ์–ธ์ด ํ•ด๋‹น ๋ฒ”์œ„(scope)์—์„œ ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฎ๊ฒจ์ง€๋Š” ๊ฒƒ
num = 6;
console.log(num); // 6
console.log(num2); // undefined

var num; // OK
var num2 = 10;
console.log(num2); // 10

catName("Chloe");

function catName(name) {
    console.log("cat's name = " + name);
}

โ†’

var num; // OK
var num2; // var num2 = 10; -> var num2 ์–˜๋งŒ ์˜ฌ๋ผ๊ฐ„๋‹ค.

function catName(name) {
    console.log("cat's name = " + name);
}

num = 6;
console.log(num); // 6
console.log(num2); // undefined

num2 = 10;
console.log(num2); // 10

catName("Chloe");

1.6 ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„(scope)

JS์—์„œ์˜ ๋ณ€์ˆ˜์˜ ์ข…๋ฅ˜

  1. ์ „์—ญ : ์ง€์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒƒ
  1. ์ง€์—ญ : ํ•จ์ˆ˜ ๋‚ด๋ถ€

<๋ณ€์ˆ˜์˜ ์ข…๋ฅ˜>

ES5 : var

ES6 : let(๋ณ€์ˆ˜), const(์ƒ์ˆ˜) โ‡’ ์ด๊ฑฐ ์‚ฌ์šฉํ•˜๊ธฐ

  • ์ „์—ญ ๋ณ€์ˆ˜

    ์ „์—ญ ๋ณ€์ˆ˜๋Š” window(๋ธŒ๋ผ์šฐ์ €)์˜ ์†์„ฑ์ž„

    ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ์“ฐ๋ฉด ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค.

    var x = 10; // ์ „์—ญ๋ณ€์ˆ˜ x ์„ ์–ธ
    var x = 5; // ์ค‘๋ณต ์„ ์–ธ ๊ฐ€๋Šฅ. ๋งˆ์ง€๋ง‰ ์„ ์–ธ๋งŒ ์œ ํšจ
    x = 3; // var x = 3;๊ณผ ๋™์ผ ์ „์—ญ๋ณ€์ˆ˜ - ์–ด๋–ค Scope์—์„œ๋“ ์ง€ ์“ธ ์ˆ˜ ์žˆ์Œ
    ใ„ด
    console.log(x); // 3
    console.log(window.x); // 3
  • ์ง€์—ญ ๋ณ€์ˆ˜
    function sum(a, b) {
        var result = 0; // ์ง€์—ญ๋ณ€์ˆ˜
        gResult = 0; // ์ „์—ญ๋ณ€์ˆ˜ window.gResult = 0;
    
    		// var i;๋Š” ์ž๊ธฐ scope์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฌ๋ผ๊ฐ
        for (var i = 0; i < arguments.length; i++) { 
            gResult += arguments[i];
        }
        console.log(i); // OK
    }
    
    sum(3, 5);
    // console.log(result); // ์—๋Ÿฌ
    console.log(gResult); // 8
    console.log(window.gResult); // 8

<JS ๊ณต๋ถ€ ๋ฐฉ๋ฒ•>

  1. ๋ฌธ์ž์—ด
  1. JS์™€ JAVA์™€์˜ ๊ฐญ

๋‚˜๋จธ์ง€๋Š” ์‹ค์ „์—์„œ ํ•„์š”ํ•  ๋•Œ ์ฑ„์›Œ๋‚˜๊ฐ€๊ธฐ ์˜ค๋ž˜ ๋ถ™์žก๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค. ํ•ต์‹ฌ๋งŒ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€๋ฉด ๋œ๋‹ค.

1.7 ํ˜•๋ณ€ํ™˜(Type conversion)

์ˆซ์ž๋กœ ๋ณ€ํ™˜ : Number(), parseInt(), parseFloat(), *1

  • Number()
    var x = Number(true); // true -> 1
    var x = Number("true") // "true" -> NaN
    var x = Number("123") // "123" -> 123
    var x = Number("123px") // "123px" -> NaN
  • parseInt()

    Number()๋ณด๋‹ค๋Š” parseInt()๋ฅผ ์“ฐ๋Š” ๊ฒŒ ์•ˆ์ „ํ•˜๊ณ  ์‹ค์ œ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

    var x = parseInt(true); // true -> NaN
    var x = parseInt("true") // "true" -> NaN
    var x = parseInt("123") // "123" -> 123
    var x = parseInt("123px3") // "123px3" -> 123 parseInt๋Š” ํ•ด์„ํ•  ์ˆ˜ ์—†์œผ๋ฉด ๊ฑฐ๊ธฐ์„œ ๋๋‚ธ๋‹ค.
  • parseFloat()
    var x = parseFloat("-1e3") // -1000
    var x = parseFloat("1"); // 1
  • *1 (String โ†’ Number)
    var x = "22" * 1; 
    typeof x // 'number'

๋ฌธ์ž๋กœ ๋ณ€ํ™˜ : String(), toString()

var num = 22;
var x = String(num); // '22'
var x = num + ""; // '22' ์ด๊ฑฐ ์‚ฌ์šฉํ•  ๊ฒƒ
var x = num.toString(); // '22'
var x = (123).toString(); // '123' ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ()๋กœ ๋ฌถ์–ด์ค˜์•ผ ํ•œ๋‹ค. ์ผ์‹œ์ ์ธ ๊ฐ์ฒดํ™”

boolean์œผ๋กœ ๋ณ€ํ™˜ : Boolean(), !!

var num = 123;
var x = Boolean(num); // true
var x = Boolean(0);  // false
var x = Boolean("0") // true
var x = !!123;       // true ์ด๊ฑฐ ์“ฐ๊ธฐ

2.2 toExponential(), toFixed(), toPrecision()

  • ์ง€์ •๋œ ์†Œ์ˆ˜์  ์ž๋ฆฌ์ˆ˜์—์„œ ๋ฐ˜์˜ฌ๋ฆผ ๊ฒฐ๊ณผ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜
    x.toExponential(2); // '9.66e+0'
    x.toExponential(4); // '9.6560e+0'
    x.toExponential(6); // '9.656000e+0'
    var x = 9.656;
    x.toFixed(0); // 10
    x.toFixed(2); // 9.66
    x.toFixed(4); // '9.6560'
    x.toFixed(6); // '9.656000'
    var x = 9.656; 
    // ์ •๋ฐ€๋„?
    x.toPrecision(); // '9.656'
    x.toPrecision(2); // '9.7'
    x.toPrecision(4); // '9.656'
    x.toPrecision(6); // '9.65600'

3. ๋ฐฐ์—ด

  • Java์™€ ๋‹ฌ๋ฆฌ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ฐฐ์—ด ์ƒ์„ฑ
    arr = []; // ๋นˆ ๋ฐฐ์—ด ์ƒ์„ฑ. ์•„๋ž˜์™€ ๊ฐ™์€ ์˜๋ฏธ. ๋˜‘๊ฐ™์œผ๋‹ˆ ๊ตณ์ด ์•„๋ž˜์ฒ˜๋Ÿผ ์“ธ ํ•„์š” X
    arr = new Array();
    arr = new Array(10); // ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•  ๋•Œ๋Š” ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
  • ๊ฐ์ฒด ์ƒ์„ฑ
    obj = {}; // ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ. ์•„๋ž˜์™€ ๊ฐ™์€ ์˜๋ฏธ. ๋˜‘๊ฐ™์œผ๋‹ˆ ๊ตณ์ด ์•„๋ž˜์ฒ˜๋Ÿผ ์“ฐ์ง€๋ง๊ณ  obj = {};๋กœ ์ƒ์„ฑํ•˜์ž.
    obj = new Object();
  • ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์— ์—ฌ๋Ÿฌ ํƒ€์ž…์˜ ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    var arr = [1, 2, 3, 4, 5];
    arr[6] = 100;
    arr // [1, 2, 3, 4, 5, empty, 100]
    arr[5] // undefined
    arr.length // 7
    
    for (var i = 0; i < arr.length; i++) console.log(arr[i]); // 1 2 3 4 5 undefined 100
    for (i in arr) console.log(arr[i]); // 1 2 3 4 5 100 / undefined๋Š” ์ถœ๋ ฅ ์•ˆ ํ•จ
  • ๋ฐฐ์—ด๋„ ๊ฐ์ฒด์ด๋ฉฐ, new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    var arr = new Array(1, 2, 3, 4, 5); // var arr = [1, 2, 3, 4, 5];
    var arr = new Array(40); // 40๊ฐœ์˜ undefined ์š”์†Œ๋“ค์ด ์ €์žฅ๋œ ๋ฐฐ์—ด
  • ๋ฐฐ์—ด์˜ length ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
    arr = []; // ๋นˆ ๋ฐฐ์—ด
    arr[0] = 1;
    arr[1] = 2;
    arr // [1, 2]
    
    arr.length; // 2
    arr[1] = 30; // ๊ธฐ์กด ๊ฐ’์ด ์žˆ์œผ๋ฉด update(๋ณ€๊ฒฝ), ์—†์œผ๋ฉด ์ถ”๊ฐ€
    
    arr.length = 10; // length ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ but ์‹ค์ œ ๊ณต๊ฐ„์ด ๋Š˜์–ด๋‚˜๋Š” ๊ฑด ์•„๋‹˜ [1, 30, empty ร— 8]
    arr.length = 1; // [1]

map() - ๋ณ€ํ™˜, flat()

arr = [1, 2, 3, 4, 5];
arr.map(e => e * 10); // [10, 20, 30, 40, 50]
arr[2] // 3 ์ŠคํŠธ๋ฆผ์˜ ํŠน์ง• : ์›๋ณธ ๋ณ€๊ฒฝ X

arr[2] = [1, 2]; // [1, 2, Array(2), 4, 5]
arr = arr.flat(); // [1, 2, 1, 2, 4, 5]
arr = arr.map(e => e * 10); // [10, 20, 10, 20, 40, 50]

arr.filter(e => e > 20) // [40, 50]
arr.find(e => e > 40) // 50 java์˜ findfirst์™€ ๊ฐ™๋‹ค.

find(), filter() - ํŠน์ • ์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ ์ฐพ๊ธฐ, ์ผ์น˜ํ•˜๋Š” ์š”์†Œ ์ฐพ๊ธฐ

var ages = [10, 20, 30, 40, 50];

function checkAdult(age) {
    return age >= 18;
}

// ์ฃผ์–ด์ง„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ๋ฐ˜ํ™˜
ages.find(checkAdult); // 20 / ์ˆœ์ฐจ ๊ฒ€์ƒ‰

// ์ฃผ์–ด์ง„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑ, ages ๋ฐฐ์—ด์—์„œ 18 ์ด์ƒ์ธ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ฐพ๋Š”๋‹ค.
ages.filter(checkAdult) // 20, 30, 40, 50

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.indexOf("Apple"); // 2
fruits.indexOf("Apple", 4); // -1 / ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ๊ฒ€์ƒ‰์„ ์‹œ์ž‘ํ•  ์ธ๋ฑ์Šค ์ง€์ •

๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ ์ถœ๋ ฅ : toString(), join()


fruits.toString(); // 'Banana,Orange,Apple,Mango'
fruits.join(" - "); // 'Banana - Orange - Apple - Mango'

์š”์†Œ์˜ ์ถ”๊ฐ€์™€ ์‚ญ์ œ

push(), pop() : ๋ฐฐ์—ด์˜ ์˜ค๋ฅธ์ชฝ์— ์š”์†Œ ์ถ”๊ฐ€/์‚ญ์ œ

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x = fruits.push("Kiwi"); // x = 5 ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€
var x = fruits.pop() // x = "Kiwi" ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ๊บผ๋ƒ„ LIFO

unshift(), shift() : ๋ฐฐ์—ด์˜ ์™ผ์ชฝ์— ์š”์†Œ ์ถ”๊ฐ€/์‚ญ์ œ

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x = fruits.unshift("Lemon"); // 5 / ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ์•ž์— ์ถ”๊ฐ€
var x = fruits.shift(); // 'Lemon' / ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์ œ๊ฑฐ

splice(), delete

splice(start, [deleteCount], [item1, item2, ...])
start : ๋ฐฐ์—ด์—์„œ ๋ณ€๊ฒฝ์„ ์‹œ์ž‘ํ•  ์ธ๋ฑ์Šค
deleteCount : ์‹œ์ž‘ ์ธ๋ฑ์Šค์—์„œ ์ œ๊ฑฐํ•  ์š”์†Œ์˜ ์ˆ˜
item1, item2, ... : ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•  ์š”์†Œ
var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x = fruits.splice(1, 1, "222"); // ๋‘ ๋ฒˆ์งธ ์š”์†Œ "Orange"๋ฅผ "222"๋กœ ๋Œ€์ฒด
// ['Banana', '222', 'Apple', 'Mango']

fruits.splice(1, 0, "111"); // ๋‘ ๋ฒˆ์งธ ์š”์†Œ์— "111"์„ ์‚ฝ์ž…
// ['Banana', '111', '222', 'Mango']
delete fruits[1]; // ์‚ญ์ œ์— ์„ฑ๊ณตํ•˜๋ฉด true๋ฐ˜ํ™˜. ์—†๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•ด๋„ ํ•ญ์ƒ true๋ฅผ ๋ฐ˜ํ™˜.
// ['Banana', undefined, '222', 'Mango']

์ •๋ ฌํ•˜๊ธฐ, ๋’ค์ง‘๊ธฐ, ์ฑ„์šฐ๊ธฐ, ํ•ฉ์น˜๊ธฐ

sort(), reverse(), fill() - ์ •๋ ฌํ•˜๊ธฐ, ๋’ค์ง‘๊ธฐ, ์ฑ„์šฐ๊ธฐ

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort(); // ['Apple', 'Banana', 'Mango', 'Orange'] ์ •๋ ฌํ•˜๊ธฐ(์‚ฌ์ „์ˆœ ์ •๋ ฌ)
fruits.reverse(); // ['Orange', 'Mango', 'Banana', 'Apple'] ์ˆœ์„œ ๊ฑฐ๊พธ๋กœ ๋’ค์ง‘๊ธฐ

var arr = [40, 100, 1, 5, 25, 10];
arr.sort(); // [1, 10, 100, 25, 40, 5] ์‚ฌ์ „์ˆœ ์ •๋ ฌ

arr.sort(function(a, b) {
            return a - b;
        }
); // [1, 5, 10, 25, 40, 100] ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
arr.sort((a, b) => a - b); // ๋žŒ๋‹ค์‹ / ์ •๋ ฌ ๊ธฐ์ค€์ธ Comparator๋ฅผ ์ค€๋‹ค.

arr.sort(
    function() {
        Math.random() - 0.5;
    }
); // [1, 10, 100, 25, 40, 5] shuffle
arr.sort(() => Math.random() - 0.5) // ๋žŒ๋‹ค์‹ / ์ •๋ ฌ๊ธฐ์ค€์ด ์ผ์ •ํ•˜์ง€ ์•Š์œผ๋‹ˆ ๊ณ„์† ๋ฐ”๋€œ => ์„ž์ธ๋‹ค.
fruits.fill("Kiwi"); // ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ Kiwi๋กœ ์ฑ„์šด๋‹ค.

๋ฐฐ์—ด ํ•ฉ์น˜๊ธฐ : concat()

var bigArr = arr1.concat(arr2); // ['Banana', 'Orange', 'Apple', 'Mango', 40, 5, 25, 100, 1, 10]
arr.concat(["Oct", "Nov", "Dec"]); // [40, 5, 25, 100, 1, 10, 'Oct', 'Nov', 'Dec']
var bigArr = arr.concat(arr2, arr3); // ์„ธ ๊ฐœ์˜ ๋ฐฐ์—ด์„ ํ•˜๋‚˜๋กœ ๋ณ‘ํ•ฉ
arr = [22, 20, 10, 7, 5, 3, 1];
newArr = arr.concat([99, 98], ['aaa', 'bbb'])
// [22, 20, 10, 7, 5, 3, 1, 99, 98, 'aaa', 'bbb']

3.4 ๋‹ค์ฐจ์› ๋ฐฐ์—ด

  • ๋‹ค์ฐจ์› ๋ฐฐ์—ด์€ ๋ฐฐ์—ด ์•ˆ์— ๋ฐฐ์—ด์„ ๋„ฃ์–ด์„œ ๊ตฌํ˜„
    // 2์ฐจ์› ๋ฐฐ์—ด(4 * 5)
    var arr2D = [
        [1, 2, 3, 4, 5],
        [1, 2, 3, 4, 5],
        [1, 2, 3, 4, 5],
        [1, 2, 3, 4, 5],
    ];
    
    // 2์ฐจ์› ๋ฐฐ์—ด arr2D์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅ
    for (var i = 0; i < arr2D.length; i++) {
    	for (var j = 0; j < arr2D[i].length; j++) {
    	  console.log(arr2D[i][j]);
    	}
    }
    
    // ๋ฐฐ์—ด arr2์•ˆ์— ๋ฐฐ์—ด์„ ๋„ฃ์–ด์„œ 2์ฐจ์› ๋ฐฐ์—ด์„ ๊ตฌ์„ฑ
    var arr2 = [];
    
    // 5 X 5 ๋ฐฐ์—ด
    for (var x = 0; x < 5; x++)
        arr2[x] = new Array(5); // ๊ธธ์ด๊ฐ€ 5์ธ ๋ฐฐ์—ด์„ ๋ฐฐ์—ด arr2์— ์ €์žฅ

5. ํ•จ์ˆ˜

5.2 ํ•จ์ˆ˜์˜ ์˜ค๋ฒ„๋กœ๋”ฉ

  • arguments ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜๋ฉด, ์ž๋ฐ”์˜ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    function subArr(arr, start, end) {
        if (arguments.length == 1) {
            return arr;
        } else if (arguments.length == 2) {
            return subArr(arr, start, arr.length);
        } else if (arguments.length == 3) {
            return arr.slice(start, end);
        }
    }
    
    var arr = [0,1,2,3,4,5,6,7];
    subArr(arr); // [0, 1, 2, 3, 4, 5, 6, 7]
    subArr(arr, 3); // [3, 4, 5, 6, 7]
    subArr(arr, 3, 5); // [3, 4]

5.3 ํ•จ์ˆ˜ - ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์™€ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”

  • ํ˜ธ์ถœ ์‹œ ์ธ์ž๊ฐ€ ์ƒ๋žต๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ if๋ฌธ์œผ๋กœ ํ™•์ธ ํ›„ ๊ธฐ๋ณธ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์ž.

    undefined == null โ†’ true

    undefined === null โ†’ false

    function myFunction(x, y) {
        if (y === undefined)
            y = 0;
    }

  • ๋„ ์ฒดํฌํ•  ๋•Œ๋Š” undefined์ธ์ง€ ๋จผ์ € ํ™•์ธํ•˜์ž.(undefined๋Š” null์ด ์•„๋‹˜)
    if (myObj != null && typeof myObj !== "undefined") // ์—๋Ÿฌ
    if (typeof myObj !== "undefined" && myObj != null) // OK
// ES6 ๋ฌธ๋ฒ•
function add(a = 0, b = 0) {
    // ES5๋ฌธ๋ฒ• old ๋ฐฉ์‹
    // var a = a || 0; a๊ฐ€ true๋กœ ํŒ๋‹จ๋˜๋Š” ๊ฐ’์ด๋ฉด a, false๋ฉด 0
    // var a = a && 0
    var sum = 0;

    console.log("a = " + a);
    console.log("b = " + b); 

    for (i = 0; i < arguments.length; i++)
        sum += arguments[i];

    return sum;
}

add(undefined, 5);
// a = 0
// b = 0

5.4 ํ•จ์ˆ˜ - ํด๋กœ์ €

  • ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    var outer = function() {
        var a =1;
        var inner = function() {
            console.log(++a);
        };
        inner();
    };
    outer();
    var outer = function() {
        var a = 1;
        var inner = function() {
            return ++a;
        }
        return inner();
    };
    outer(); // 2
    outer(); // 2
    outer(); // 2
    var outer = function() {
        var a = 1;
        var inner = function() {
            return ++a;
        }
        return inner;
    };
    var outer2 = outer();
    outer2(); // 2
    outer2(); // 3
    outer2(); // 4
    • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์–ด๋–ค ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์€ ์ˆ˜์ง‘ ๋Œ€์ƒ์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

      ์˜ˆ์ œ1, 2 โ†’ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŒ… ๋Œ€์ƒ์— ํฌํ•จ

      ์˜ˆ์ œ3 โ†’ ์ œ์™ธ(์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŒ…๋˜์ง€ ์•Š์Œ, ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€๋กœ ์ „๋‹ฌ๋œ ๊ฒฝ์šฐ์—๋งŒ ์œ ์ผํ•˜๊ฒŒ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŒ…๋˜์ง€ ์•Š๋Š”๋‹ค.)

    • ํด๋กœ์ €

      ์–ด๋–ค ํ•จ์ˆ˜ A์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ a๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜ B๋ฅผ ์™ธ๋ถ€๋กœ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ A์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„์—๋„ ๋ณ€์ˆ˜ a๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ํ˜„์ƒ

  • back
    • ์ „์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๋ฉด ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ์ถฉ๋Œ๋  ์ˆ˜ ์žˆ๊ณ , ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ชปํ•˜๊ฒŒ ๊ฐ’์„ ๋ณดํ˜ธํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ
      var cnt = 0; // ์ „์—ญ๋ณ€์ˆ˜๋ผ์„œ ๋ณ€์ˆ˜ ์ด๋ฆ„ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค. ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ. ๊ฐ’ ๋ณดํ˜ธ ํ•„์š”
      
      function increseCnt() {
          cnt++;
      }
      
      increseCnt();
      increseCnt();
      increseCnt();
      console.log(cnt);
    • ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๋ฉด, ๋ณ€์ˆ˜๊ฐ€ ๋ณดํ˜ธ๋˜๊ธด ํ•˜์ง€๋งŒ ๋งค๋ฒˆ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋จ
      function increseCnt() {
          var cnt = 0; // ์ง€์—ญ๋ณ€์ˆ˜. ๋ฒ”์œ„(์Šค์ฝ”ํ”„)๋Š” ์ข์•„์กŒ์œผ๋‚˜ ๋งค๋ฒˆ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋จ
          cnt++;
      }
      
      increseCnt();
      increseCnt();
      increseCnt();
      console.log(cnt); // ์—๋Ÿฌ
    • ๋ณ€์ˆ˜๋ฅผ ์ง€์—ญ ๋ณ€์ˆ˜๋กœํ•˜๊ณ , ๋‚ด๋ถ€ ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ. ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ผ์„œ ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœ ๋ถˆ๊ฐ€.
      function closure() {
          var cnt = 0;
      
          function increseCnt() { // ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•จ์ˆ˜๋ฅผ return ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
              cnt++;
              console.log(cnt);
          }
      
          increseCnt();
      }
      
      closure();
      // increseCnt(); // ์—๋Ÿฌ 
    • ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ, ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ
      function closure() {
          var cnt = 0;
      
          return function increseCnt() { // ์ด๋ฆ„ ์ƒ๋žต ๊ฐ€๋Šฅ
              cnt++;
              console.log(cnt);
          };
      }
      
      var increseCnt = closure(); // ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      increseCnt(); // 1
      increseCnt(); // 2
      increseCnt(); // 3

    • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜๋„์™€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค.
      for (var i = 0; i < 3; i++) { // var๋ฅผ let์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐ๋จ
      		/* setTimeout : ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ํŠน์ • ์‹œ๊ฐ„ ํ›„์— ์‹คํ–‰ํ•˜๋„๋ก ์˜ˆ์•ฝํ•œ๋‹ค.(์ง€์—ฐ ์‹œ๊ฐ„ : ๋ฐ€๋ฆฌ์ดˆ๋‹จ์œ„)
      		   0 ๋ฐ€๋ฆฌ์ดˆ ํ›„์— 'console.log(i)'๋ฅผ 3๋ฒˆ ์‹คํ–‰ํ•˜๋Š” ์˜ˆ์•ฝ์„ ํ•œ๋‹ค.
      		   i๋ฅผ ์ฝ์–ด์˜ค๋Š” ์‹œ์ ์ด for๋ฌธ์„ ๋‹ค ๋ˆ ์‹œ์ ์ด๊ธฐ  ๋•Œ๋ฌธ์— 3์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค. */
          setTimeout(function() {console.log(i);}, 0);
      }
    • ์ด๋Ÿด ๋•Œ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํด๋กœ์ €๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค.
      for (var i = 0; i < 3; i++) {
      		/* ์œ„์—์„œ์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด function์œผ๋กœ ํ•œ ๋ฒˆ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค.
             ํ˜ธ์ถœํ•˜๋Š” ์‹œ์ ์— i๊ฐ’์ด x์— ๋ณต์‚ฌ๋œ๋‹ค. */
      		(function(x) { setTimeout(function() {console.log(x);}, 0) }) (i);
      }
    • ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋ฐฐ์—ด๊ณผ forEach()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์žˆ๋‹ค.
      [0, 1, 2].forEach(function(i) {
          setTimeout(function() {console.log(i);}, 0);
      });

  • ์ „์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๋ฉด ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ์ถฉ๋Œ๋  ์ˆ˜ ์žˆ๊ณ , ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ชปํ•˜๊ฒŒ ๊ฐ’์„ ๋ณดํ˜ธํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ
    var cnt = 0; // ์ „์—ญ๋ณ€์ˆ˜๋ผ์„œ ๋ณ€์ˆ˜ ์ด๋ฆ„ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค. ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ. ๊ฐ’ ๋ณดํ˜ธ ํ•„์š”
    
    var increseCnt = function() {
    		console.log(++cnt);
    }
    
    increseCnt();
    increseCnt();
    increseCnt();
    console.log(cnt);
  • ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๋ฉด, ๋ณ€์ˆ˜๊ฐ€ ๋ณดํ˜ธ๋˜๊ธด ํ•˜์ง€๋งŒ ๋งค๋ฒˆ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋จ
    var increseCnt = function() {
        var cnt = 0; // ์ง€์—ญ๋ณ€์ˆ˜. ๋ฒ”์œ„(์Šค์ฝ”ํ”„)๋Š” ์ข์•„์กŒ์œผ๋‚˜ ๋งค๋ฒˆ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋จ
    		console.log(++cnt);
    }
    
    increseCnt(); // 1
    increseCnt(); // 1
    increseCnt(); // 1
    console.log(cnt); // ์—๋Ÿฌ
  • ๋ณ€์ˆ˜๋ฅผ ์ง€์—ญ ๋ณ€์ˆ˜๋กœํ•˜๊ณ , ๋‚ด๋ถ€ ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ. ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ผ์„œ ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœ ๋ถˆ๊ฐ€.
    function closure() {
        var cnt = 0;
    
        var increseCnt = function() { // ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•จ์ˆ˜๋ฅผ return ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
            console.log(++cnt);
        }
        increseCnt();
    }
    closure(); // 1
    // increseCnt(); // ์—๋Ÿฌ
    function closure() {
        var cnt = 0;
    
        var increseCnt = function() { // ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•จ์ˆ˜๋ฅผ return ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
            console.log(++cnt);
        }
        return increseCnt();
    }
    closure(); // 1
  • ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ, ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ
    function closure() {
        var cnt = 0;
    
        var increseCnt = function() {
            console.log(++cnt);
        }
        return increseCnt; // ํ•จ์ˆ˜ return
    }
    
    var increseCnt = closure(); // ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    increseCnt(); // 1
    increseCnt(); // 2
    increseCnt(); // 3

  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์–ด๋–ค ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์€ ์ˆ˜์ง‘ ๋Œ€์ƒ์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

    ์˜ˆ์ œ1, 2 โ†’ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŒ… ๋Œ€์ƒ์— ํฌํ•จ

    ์˜ˆ์ œ3 โ†’ ์ œ์™ธ(์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŒ…๋˜์ง€ ์•Š์Œ, ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€๋กœ ์ „๋‹ฌ๋œ ๊ฒฝ์šฐ์—๋งŒ ์œ ์ผํ•˜๊ฒŒ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŒ…๋˜์ง€ ์•Š๋Š”๋‹ค.)

  • ํด๋กœ์ €

    ์–ด๋–ค ํ•จ์ˆ˜ A์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ a๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜ B๋ฅผ ์™ธ๋ถ€๋กœ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ A์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„์—๋„ ๋ณ€์ˆ˜ a๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ํ˜„์ƒ


  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜๋„์™€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค.
    for (var i = 0; i < 3; i++) { // var๋ฅผ let์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐ๋จ
    		/* setTimeout : ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ํŠน์ • ์‹œ๊ฐ„ ํ›„์— ์‹คํ–‰ํ•˜๋„๋ก ์˜ˆ์•ฝํ•œ๋‹ค.(์ง€์—ฐ ์‹œ๊ฐ„ : ๋ฐ€๋ฆฌ์ดˆ๋‹จ์œ„)
    		   0 ๋ฐ€๋ฆฌ์ดˆ ํ›„์— 'console.log(i)'๋ฅผ 3๋ฒˆ ์‹คํ–‰ํ•˜๋Š” ์˜ˆ์•ฝ์„ ํ•œ๋‹ค.
    		   i๋ฅผ ์ฝ์–ด์˜ค๋Š” ์‹œ์ ์ด for๋ฌธ์„ ๋‹ค ๋ˆ ์‹œ์ ์ด๊ธฐ  ๋•Œ๋ฌธ์— 3์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค. */
        setTimeout(function() {console.log(i);}, 0);
    }
  • ์ด๋Ÿด ๋•Œ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํด๋กœ์ €๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค.
    for (var i = 0; i < 3; i++) {
    		/* ์œ„์—์„œ์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด function์œผ๋กœ ํ•œ ๋ฒˆ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค.
           ํ˜ธ์ถœํ•˜๋Š” ์‹œ์ ์— i๊ฐ’์ด x์— ๋ณต์‚ฌ๋œ๋‹ค. */
    		(function(x) { setTimeout(function() {console.log(x);}, 0) }) (i);
    }
  • ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋ฐฐ์—ด๊ณผ forEach()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์žˆ๋‹ค.
    [0, 1, 2].forEach(function(i) {
        setTimeout(function() {console.log(i);}, 0);
    });

ํด๋กœ์ €๋Š” ์ž๋ฐ”์—์„œ์˜ ๊ฒŒํ„ฐ ์„ธํ„ฐ์™€ ๋™์ผ ์ผ์ข…์˜ ์ฝ”๋”ฉ ํŒจํ„ด? ํ•จ์ˆ˜ ์•ˆ์— ๋„ฃ์œผ๋ฉด ๊ฐ’์ด ์ž˜๋ชป๋  ์ผ์ด ์—†์Œ


4/19(์ˆ˜)

6. ๊ฐ์ฒด

6.1 ๊ฐ์ฒด์˜ ์ƒ์„ฑ๋ฐฉ๋ฒ•

  1. ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„, ๋ฉค๋ฒ„(์†์„ฑ, ํ•จ์ˆ˜)๋ฅผ ์ถ”๊ฐ€
    // var person = new Object();๊ณผ ๋™์ผ -> ๊ตณ์ด? var person = {}; ์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ
    var person = {}; // ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ
    
    // ๊ฐ์ฒด์— ์†์„ฑ ์ถ”๊ฐ€
    person.firstName = "John";
    person.lastName = "Doe";
    person.age = 50;
    person.eyeColor = "blue";
  1. ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ๋ฉค๋ฒ„๋ฅผ ์ถ”๊ฐ€
    let myObject = {
        firstName : "John",
        lastName : "Doe",
        fullName : function() { // key : value ์Œ์œผ๋กœ ์ €์žฅํ•œ๋‹ค. function๋„ ์ €์žฅ ๊ฐ€๋Šฅ
            return this.firstName + " " + this.lastName;
        }
    };

6.2 ์ƒ์„ฑ์ž๋กœ ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ

  • ์ƒ์„ฑ์ž๋ฅผ ์ •์˜ํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    function Person(name, age) { // ์ƒ์„ฑ์ž Person ์„ ์–ธ. ์ƒ์„ฑ์ž์˜ ์ฒซ ๊ธ€์ž๋Š” ๋Œ€๋ฌธ์ž๋กœ
        this.name = name; // ์—ฌ๊ธฐ์„œ this๋Š” (์•ž์œผ๋กœ ์ƒ์„ฑ๋ ) ๊ฐ์ฒด ์ž์‹ ์„ ์˜๋ฏธ
        this.age = age;
    }
    
    var obj = new Person("david", 10);
    var obj2 = new Person("wendy", 20);
    
    obj.toString = function() {
        return this.name + this.age; // this๋ฅผ  ๊ผญ ๋ถ™์—ฌ์•ผํ•จ
    }
    
    obj.toString(); // 'david10'
    obj2.toString(); // '[object Object]' // JS๋Š” ๊ฐ์ฒด ๊ณต์œ X ๋‹ค ๊ฐœ๋ณ„์ž„ ๊ทธ๋ž˜์„œ ํ”„๋กœํ† ํƒ€์ž…์”€

6.3 ๊ฐ์ฒด์˜ ์†์„ฑ(๋ฉค๋ฒ„) ์‚ญ์ œํ•˜๊ธฐ - delete

  • delete ์—ฐ์‚ฐ์ž๋กœ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.(๋ฌผ๋ ค๋ฐ›์€ ์†์„ฑ์€ ์‚ญ์ œ๋ถˆ๊ฐ€)
    var obj = {}; // ๋นˆ ๊ฐ์ฒด
    
    // ์†์„ฑ์„ ์ถ”๊ฐ€
    obj.name = 'david';
    obj.age = 10;
    
    // toString()์ถ”๊ฐ€ - ์ž๋ฐ”์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    obj.toString = function() {
        return this.name + ", " + this.age;
    }
    
    obj.toString(); // 'david, 10'
    delete obj.name; // ๊ฐ์ฒด obj์—์„œ ์†์„ฑ name์„ ์‚ญ์ œ
    obj; // {age: 10, toString: ฦ’}

6.4 instanceof์™€ typeof

  • instanceof๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ์ƒ์„ฑ์ž์— ์˜ํ•ด ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅ

    function๋„ object์ด๋‹ค.

    var obj = new Object();
    var p = new Person("david", 10);
    var s = new String(); // var str = 'abc'๋กœ ์“ฐ๊ธฐ
    var f = new Function(); // var f = function() {}; ์™€ ๋™์ผ
    
    typeof obj // 'object'
    typeof p   // 'object'
    typeof s   // 'object'
    typeof f   // 'function'
    
    obj instanceof Object // true
    p instanceof Object // true
    s instanceof Object // true
    f instanceof Object // true
    
    obj instanceof String // false
    p instanceof Person // true
    s instanceof String // true
    f instanceof Function // true
    
    ----
    
    typeof new Object() // 'object'
    typeof new Person("david", 10)   // 'object'
    typeof new String()   // 'object'
    typeof new Function()   // 'function'
    str = 'abc';
    strObj = new String('aaa');
    
    typeof str; // 'string'
    typeof strObj; // 'object'
    
    str instanceof String    // false ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— 
    strObj instanceof String // true

6.5 ๊ฐ™์€ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ผ๋„ ํ•จ์ˆ˜๋ฅผ ๊ณต์œ ์•ˆํ•จ.

  • ๊ฐ™์€ ์ƒ์„ฑ์ž๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ผ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

    ์ด๋ ‡๊ฒŒ ๊ณต์œ ๊ฐ€์•ˆ ๋˜๋Š” ๋ฌธ์ œ๋ฅผ prototype์ด๋ผ๋Š” ๊ณต์œ  ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ ํ•ด๊ฒฐ.

    obj.getName = function() {
        return this.name;
    }
    
    obj.getName(); // 'david'
    obj2.getName(); // ์—๋Ÿฌ. obj2์—๋Š” getName()์ด ์—†์Œ
    
    for (var prop in obj)
        console.log(obj[prop]); // ์†์„ฑ์ด 3๊ฐœ Personย {name: 'david', age: 10, getName: ฦ’}
    
    for (var prop in obj2)
        console.log(obj[prop]); // ์†์„ฑ์ด 2๊ฐœ Personย {name: 'wendy', age: 20}

this

  1. ๊ฐ์ฒด ์ž์‹  โ† ๋Œ€๋ถ€๋ถ„ ์ด๊ฑฐ์ž„
  1. window(๋ธŒ๋ผ์šฐ์ €)
function Person(name, age) {
    this.name = name;
    this.age = age;
}

let p1 = Person('ccc', 20);
// new๋ฅผ ์“ฐ๋ฉด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  ์ฃผ์†Œ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š”๋ฐ new๋ฅผ ์•ˆ ์“ฐ๋ฉด ๊ฐ์ฒด๊ฐ€ ์•ˆ ๋งŒ๋“ค์–ด์ง
let p2 = Person('ccc', 20); 
// ๊ฐ์ฒด๊ฐ€ ์—†์œผ๋ฉด window์ด๊ธฐ ๋•Œ๋ฌธ์— window์— name๊ณผ age๊ฐ€ ์ถ”๊ฐ€๋จ
window.name; // '๋ฐฉ์ฑ„๋ฏผ'
window.age; // 22

6.6 prototype, __proto__, constructor

  • ๊ฐ์ฒด๋Š” ์ž์‹ ์„ ์ƒ์„ฑํ•œ ์ƒ์„ฑ์ž์˜ prototype์— ๋Œ€ํ•œ ์ฐธ์กฐ์ธ __proto__์™€ constructor ์†์„ฑ์„ ์ž๋™์œผ๋กœ ๋ฌผ๋ ค๋ฐ›๋Š”๋‹ค.
    function Person(name, age) {
        this.name = name;
        this.age = age;
    }
    
    Object.prototype === obj.__proto__; // true
    
    var p = new Person("david", 10);
    Person.prototype === p.__proto__ // true
    
    var s = new String();
    String.prototype === s.__proto__ // true
    
    var f = new Function();
    Function.prototype === f.__proto__ // true
    
    obj.constructor == Object; // true
    p.constructor == Person; // true
    

6.7 ์ƒ์„ฑ์ž์˜ prototype์„ ์ด์šฉํ•œ ๊ณต์œ  ํ•จ์ˆ˜

prototype = ๊ณต์œ ๊ฐ์ฒด

  • ์ƒ์„ฑ์ž์˜ prototype์— ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ฐ์ฒด๊ฐ„ ํ•จ์ˆ˜ ๊ณต์œ  ๊ฐ€๋Šฅ

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ๊ฐ์ฒด๋Š” ๋™์ผํ•œ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•ด๋„ ๋ชจ๋“  ๊ฑธ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ฐ์ฒด๋งˆ๋‹ค ๋ฉ”์„œ๋“œ๋ฅผ ์ผ์ผํžˆ ์ง‘์–ด๋„ฃ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•ด ํ”„๋กœํ† ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. static ์ฒ˜๋Ÿผ ๊ณต์œ ํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์€ ๊ฑธ prototype์— ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

    1. ๋ชจ๋“  ๊ฐ์ฒด๋Š” ๋ฉค๋ฒ„์— __proto__๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    1. ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ๋ฉค๋ฒ„์— prototype์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

    ๋ฉค๋ฒ„๋ฅผ ์ฐพ๋Š”๋ฐ ๊ฐ์ฒด์— ์—†์œผ๋ฉด ๊ณต์œ  ๊ฐ์ฒด๋ฅผ ๋’ค์ง„๋‹ค. ๊ณต์œ  ๊ฐ์ฒด์—๋„ ์—†์œผ๋ฉด Object๋ฅผ ๋’ค์ง

    Person ๊ฐ์ฒด โ†’ Person.prototype(๊ณต์œ  ๊ฐ์ฒด) โ†’ Object

    function Person(name, age) {
        this.name = name;
        this.age = age;
    }
    
    var obj = new Person("david", 10);
    var obj2 = new Person("wendy", 20);
    
    // ์ƒ์„ฑ์ž์˜ prototype์— ํ•จ์ˆ˜ getName()์„ ์ถ”๊ฐ€. ์ด์ œ๋Š” p1 p2๊ฐ€ ๋‹ค ๊ณต์œ ํ•œ๋‹ค.
    Person.prototype.getName = function() {
        return this.name;
    }
    // ์œ„์™€ ๋™์ผ
    obj.__proto__.getName = function() {
        return this.name;
    }
    
    obj.getName(); // 'david'
    obj2.getName(); // 'wendy'

p.constructor; // p์˜ ์ƒ์„ฑ์ž. constructor ํ˜ธ์ถœ ์‹œ ์ƒ์„ฑ์ž๊ฐ€ ๋‚˜์˜จ๋‹ค.
ฦ’ Person(name, age) {
    this.name = name;
    this.age = age;
}

p.__proto__ == Person.prototype; // true

6.8 ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•˜๋Š” this

  • this๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธ. ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง.
  • ์ „์—ญ ๋ฒ”์œ„์—์„œ this๋Š” window(๋ธŒ๋ผ์šฐ์ €)๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
    alert("abc");
    this.alert("abc");   // this๋Š” window๋ฅผ ์˜๋ฏธ
    window.alert("abc");
    console.log(this);   // window ๊ฐ์ฒด๋ฅผ ์˜๋ฏธ
    // ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ
    var p = new Person("Tom", 33); // Personย {name: 'Tom', age: 33}
    // ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์Œ
    var p2 = Person("Tim", 22); // undefined
    
    p2;        // undefined
    this.name; // 'Tim'
    this.age;  // 2
    var p3 = {};
    var p4 = new Object();
    
    // call๊ณผ apply๋Š” ๋ฌธ๋ฒ•๋งŒ ๋‹ค๋ฅผ๋ฟ ๋™์ผํ•˜๋‹ค.
    Person.call(p3, "Sebin", 11); // {name: 'Sebin', age: 11}
    Person.apply(p3, ["Yebin", 9]); // {name: 'Yebin', age: 9}ใ…‡
    
  • evnet ํ•จ์ˆ˜ ๋‚ด์—์„œ์˜ this๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์š”์†Œ(element)๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

    ๋‹จ, ์ด๋ฒคํŠธ ํ•จ์ˆ˜๋ฅผ ๋žŒ๋‹ค์‹์œผ๋กœ ์ž‘์„ฑํ•  ์‹œ this๋Š” ์ „์—ญ ๊ฐ์ฒด window๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

    h1.onclick = () => alert(this); // this = window
    h1.onclick = function() {
        alert(this); // h1
    }

6.9 call(), apply()๋กœ this์˜ ๋Œ€์ƒ ๋ณ€๊ฒฝ

  • call(), apply(), bind()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด์žˆ๋Š” ๊ฐ์ฒด์—๊ฒŒ ์ ์šฉํ•  ๋•Œ call, apply๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    function Person(name, age) {
        this.name = name;
        this.age = age;
    		console.log("[" + this.name + ", " + this.age + "]");
    }
    
    var p = new Person("Tom", 33); // ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ
    var p2 = Person("Tim", 22); // ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์Œ
    
    Person.call(p3, "Sebin", 11); // p3 = new Person("Sebin", 11);์™€ ๋™์ผํ•œ ์˜๋ฏธ
    Person.apply(p4, ["๋ฐฉ์ฑ„๋ฏผ", 22]]);

6.10 ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜์—์„œ์˜ this

  • ํ•จ์ˆ˜๊ฐ€ ์ค‘์ฒฉ๋˜๋ฉด this์˜ ์˜๋ฏธ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

    ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ํ•จ์ˆ˜ ๋‚ด์—์„œ์˜ this๋Š” ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. but ๋‘ ๋ฒˆ ์ด์ƒ ์ค‘์ฒฉ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉด ์ „์—ญ ๊ฐ์ฒด(window)๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

    var myObj = {
        func1 : function() {
            console.log(this); // myObj ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ํ•จ์ˆ˜ ๋‚ด์—์„œ์˜ this๋Š” ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด
            var func2 = function() {
                console.log(this); // window
                var func3 = function() {
                    console.log(this); // window
                } ();
            } ();
        }
    }
    
    myObj.func1();

    <ํ•ด๊ฒฐ๋ฐฉ๋ฒ•>

    1. this = this โ† ๋ณ„๋„์˜ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.
    1. bind()
    1. ๋žŒ๋‹ค์‹
  • ๋ณ„๋„์˜ ๋ณ€์ˆ˜์— this์˜ ๊ฐ’์„ ์ €์žฅํ•ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•
    var myObj2 = {
        myFunc : function() { // myObj2์˜ ๋ฉค๋ฒ„ key : myFunc value : function
            var that = this; // this๊ฐ€ ๋ฉ€์ฉกํ•  ๋•Œ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.
            var myFunc2 = function() {
                console.log("that : " + that); // that์€ myObj
                console.log("this : " + this); // this๋Š” window
            } ();
        }
    }

6.11 HTML๊ณผ jQuery์—์„œ์˜ this

  • this๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธ. ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง
    <body>
    <!-- this๋Š” <h1>์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. -->
    <h1 onclick="this.innerHTML = 'Ooops!'">Click on this text!</h1>
    
    <!-- this๋Š” <span>์„ ๊ฐ€๋ฆฌํ‚ด -->
    <span onmouseover="this.style.color='red'"
            onmouseout = "this.style.color='blue'">
        Mouse over me!
    </span>
    
    // this๋Š” <p>๋ฅผ ๊ฐ€๋ฆฌํ‚ด
    $("p").click(function(){
        $(this).slideUp();
    });

6.12 ๊ฐ์ฒด์˜ ์†์„ฑ์— ์ ‘๊ทผ ์ œํ•œํ•˜๊ธฐ

  • ์ƒ์„ฑ์ž์˜ ๋ณ€์ˆ˜๋ฅผ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์—ฌ ์ ‘๊ทผ์„ ์ œํ•œ, ๋Œ€์‹  getter๋ฅผ ์ œ๊ณต
    function Person(name, age) {
        this.name = name; // ์—ฌ๊ธฐ์„œ this๋Š” p1
        this.age = age;
    }
    --------------------------------
    let p1 = new Person("๋ฐฉ์ฑ„๋ฏผ", 44);
    p1.name; // '๋ฐฉ์ฑ„๋ฏผ'
  • js๋Š” ์ ‘๊ทผ์ œ์–ด์ž๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— iv โ†’ lv๋กœ ๋ณ€๊ฒฝํ•ด์„œ ๋ณดํ˜ธํ•œ๋‹ค.
    function Person(name, age) {
        // this.name = name;
        // this.age = age;
        var name = name; // ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธ
        var age = age; // ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธ
    
        this.getName = function() {
            return name;
        }
    
        this.getAge = function() {
            return age;
        }
    }
    --------------------------------
    var p2 = new Person("๋ฐฉ์ฑ„๋ฏผ", 22);
    p2.getName(); // '๋ฐฉ์ฑ„๋ฏผ'
    p2.getAge();  // 22
    
    p.name; // ์—๋Ÿฌ. ์ง€์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ
    p.age;  // ์—๋Ÿฌ. ์ง€์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ

6.13 ๋‘ ๊ฐ์ฒด๊ฐ„์˜ ์ƒ์†๊ด€๊ณ„ ๋งบ์–ด์ฃผ๊ธฐ

  • Person ๊ฐ์ฒด์™€ Manager ๊ฐ์ฒด๋ฅผ ์กฐ์ƒ ์ž์† ๊ด€๊ณ„๋กœ ๋งบ์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•
    function Person(name, age) {
        this.name = name;
        this.age = age;
    }
    
    function Manager(dept, name, age) {
        Person.call(this, name, age); // ์กฐ์ƒ์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ
    		this.dept = dept;
    }
    
    var m = new Manager('Sales', 'adsf', 12);
    m.age; // 12
    m instanceof Person // false
    
    // Manager.prototype = Person.prototype; // ์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•
    Manager.prototype.__proto__ = Person.prototype; // ๋ถ€๋ชจ ์ž์‹ ์ƒ์† ๊ด€๊ณ„ ๋งบ์–ด์ฃผ๊ธฐ
    

7.1 DOM

= (Document Object Model)

  • ๋ธŒ๋ผ์šฐ์ €๋Š” HTML ๋ฌธ์„œ๋ฅผ ์ฝ์–ด์„œ DOM์„ ๊ตฌ์„ฑํ•œ๋‹ค.
    <!DOCTYPE html>
    <html lang="en">
    <head>
    	<title>My title</title>
    </head>
    <body>
    	<a href="">My link</a>
    	<h1>My header</h1>
    </body>

    ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML์„ ์ฝ์–ด์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ๊ณ„์ธต๊ตฌ์กฐ๋กœ ๋งŒ๋“ ๋‹ค. โ†’ ์ด๊ฒŒ ๋”ํŠธ๋ฆฌ

    DOM = html์ฝ์–ด์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ์ฒด๋“ค๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ทธ๋ฆฐ ๊ฒƒ

  • CSSOM

    ๋””์ž์ธ(css) ๊ด€๋ จ๋œ ํŠธ๋ฆฌ

Render Tree = DOM + CSSOM

(data๋ผˆ๋Œ€) + (๋””์ž์ธ)

๋ธŒ๋ผ์šฐ์ €๊ฐ€ Rener Tree๋ฅผ ๋ณด๊ณ  ์˜์—ญ์„ ์žก๋Š”๋‹ค.

  1. ๋ ˆ์ด์•„์›ƒ
  1. ํŽ˜์ธํŠธ
  1. ์ขŒํ‘œ, ์‚ฌ์ด์ฆˆ ๊ณ„์‚ฐ

DOM์—์„œ ์š”์†Œ(element) ์ฐพ๊ธฐ

document.getElementById(id) // id๋กœ ์ฐพ๊ธฐ
document.getElementByTagName(name) // Tag๋กœ ์ฐพ๊ธฐ
document.getElementByClassName(name) // class๋กœ ์ฐพ๊ธฐ
document.getElementsByName(name) // name์œผ๋กœ ์ฐพ๊ธฐ
document.querySelectorAll("์…€๋ ‰ํ„ฐ") // CSS selector๋กœ ์ฐพ๊ธฐ
[์ฐธ๊ณ ] document.querySelector("์…€๋ ‰ํ„ฐ") // ํ•œ ๊ฐœ๋งŒ ๋ฐ˜ํ™˜

DOM์—์„œ ์š”์†Œ(element) ๋ณ€๊ฒฝํ•˜๊ธฐ

element.innerHTML = "์ƒˆ๋กœ์šด ๋‚ด์šฉ";
element.style.CSS์†์„ฑ = ๊ฐ’;     // CSS ์†์„ฑ ๋ณ€๊ฒฝ
element.setAttribute(์†์„ฑ, ๊ฐ’); // element.์†์„ฑ = ๊ฐ’;
var attr = element.getAttribute("์†์„ฑ"); // ์†์„ฑ ์ฝ์–ด์˜ค๊ธฐ
<h1 id="click" onclick="this.innerHTML = 'Ooops!'">Click on this text!</h1>

const h1 = document.getElementById('click');
h1.innerHTML = '๋ฐฉ์ฑ„๋ฏผ';
h1.style.color = 'blue';
h1.setAttribute(name, 'nametest');
h1.getAttribute('id'); // 'click'

์‹ค์Šต1 - window.onload

: html ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ชจ๋‘ ๋กœ๋“œ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒ๋˜๋Š” ์ด๋ฒคํŠธ

window.onload = function() {
    var h1Tag = document.getElementById('header0'); // id๊ฐ€ header0์ธ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
    var h1Tags = document.querySelectorAll('h1');

    h1Tag.innerHTML += '- first';

    for (i = 0; i < h1Tags.length; i++) {
        h1Tags[i].innerHTML += '-' + i;
        h1Tags[i].style.border = '2px solid red'; // ํ…Œ๋‘๋ฆฌ 2px, ๋นจ๊ฐ„์ƒ‰์œผ๋กœ
        h1Tags[i].style.color = 'orange'; // ๊ธ€์ž์ƒ‰์„ orange
        h1Tags[i].style.backgroundColor = 'yellow';
    }
}

์‹ค์Šต2 - createElement, createTextNode

: ๋…ธ๋“œ ์ง์ ‘ ์ƒ์„ฑ

  1. ์ง์ ‘ ์š”์†Œ ์ƒ์„ฑ
  1. text๋กœ ์ƒ์„ฑ(๋ฌธ์ž์—ด)

    โ†’ 2๋ฒˆ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฑฐ์— ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒŒ ์ข‹์Œ

var h1 = document.createElement('h1'); // ๋…ธ๋“œ๋ฅผ ์ง์ ‘ ์ƒ์„ฑ h1 ํƒœ๊ทธ ์ƒ์„ฑ
var txtNode = document.createTextNode('Hello');

h1.appendChild(txtNode); // h1ํƒœ๊ทธ์— text node๋ฅผ ์ถ”๊ฐ€
document.body.appendChild(h1); // h1ํƒœ๊ทธ๋ฅผ body ํƒœ๊ทธ์— ์ถ”๊ฐ€

// ์œ„์˜ 4์ค„์ด ์•„๋ž˜ 1์ค„๊ณผ ๋™์ผ
// document.body.innerHTML = '<h1>Hello</h1>';

์‹ค์Šต3 : ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ

์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์€ setAttribute(), getAttribute()๋กœ ์ฝ๊ณ  ์“ฐ๊ธฐ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.

window.onload = function() {
    var img = document.createElement('img');

    img.setAttribute('src', '../jokebear.png'); // img.src = "cat.jpg"
    img.setAttribute('width', 300);             // img.width = 300;
    img.setAttribute('height', 200);            // img.height = 200;
    img.setAttribute('id', 'img');

    // ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์€ setAttribute(), getAttribute()๋กœ ์ฝ๊ณ  ์“ฐ๊ธฐ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.
    img.setAttribute('data-prop', 100); // img.data-prop = 100;๋Š” ๋ถˆ๊ฐ€

    document.body.appendChild(img); // ๋…ธ๋“œ๋ฅผ DOM์— ์—ฐ๊ฒฐ
}

DOM์—์„œ ์š”์†Œ(element) ์ˆœํšŒํ•˜๊ธฐ(navigation)

firstChild, fistElementChild : ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ์— ์ ‘๊ทผ
lastChild, lastElementChild : ๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ์— ์ ‘๊ทผ
nextSibling, nextElementSibling : ๋‚ด ๋‹ค์Œ ํ˜•์ œ ๋…ธ๋“œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
previousSibling, previousElementSibling : ๋‚ด ์ด์ „ ํ˜•์ œ ๋…ธ๋“œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
parentNode : ์š”์†Œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ

7.2 ์ด๋ฒคํŠธ(event)

  • HTML์˜ ์š”์†Œ์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด โ€˜HTML์ด๋ฒคํŠธ(event)โ€™์ด๋‹ค.

<์ž์ฃผ ์“ฐ์ด๋Š” ์ด๋ฒคํŠธ๋“ค>

์ด๋ฒคํŠธ(์†์„ฑ)์„ค๋ช…
onload๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ํŽ˜์ด์ง€์˜ ๋กœ๋”ฉ์„ ๋งˆ์ณค์„ ๋•Œ
onclick์‚ฌ์šฉ์ž๊ฐ€ HTML ์š”์†Œ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ
onmouseover๋งˆ์šฐ์Šค๊ฐ€ HTML ์š”์†Œ์˜ ์œ„์— ์˜ฌ๋ผ๊ฐ”์„ ๋•Œ
onmouseout๋งˆ์šฐ์Šค๊ฐ€ HTML ์š”์†Œ์˜ ์œ„์—์„œ ๋ฐ–์œผ๋กœ ๋ฒ—์–ด๋‚ฌ์„ ๋•Œ
onkeydown์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ
onchangeHTML ์š”์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ

์ด๋ฒคํŠธ ๋ชจ๋ธ

  • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ ์‹œ, ์ˆ˜ํ–‰๋  ์ž‘์—…์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ โ€˜์ด๋ฒคํŠธ ์ฒ˜๋ฆฌโ€™๋ผ๊ณ  ํ•œ๋‹ค.
  • ๋ฌธ์„œ ๊ฐ์ฒด(document object)์— ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•(์ด๋ฒคํŠธ ๋ชจ๋ธ)

<DOM Level 0> - old

  • ๊ธฐ๋ณธ ์ด๋ฒคํŠธ ๋ชจ๋ธ(๊ณ ์ „ ์ด๋ฒคํŠธ ๋ชจ๋ธ)
  • ์ธ๋ผ์ธ ์ด๋ฒคํŠธ ๋ชจ๋ธ

h1.onclick = function() {} // 1๊ฐœ๋งŒ ๋Œ€์ž… ๊ฐ€๋Šฅ

<DOM Level 2> - new

  • ํ‘œ์ค€ ์ด๋ฒคํŠธ ๋ชจ๋ธ
  • IE ์ด๋ฒคํŠธ ๋ชจ๋ธ

addEventListener() // ์—ฌ๋Ÿฌ๊ฐœ ๋“ฑ๋ก ๊ฐ€๋Šฅ

๊ธฐ๋ณธ ์ด๋ฒคํŠธ ๋ชจ๋ธ

  • ๋ฌธ์„œ ๊ฐ์ฒด(document object)์˜ ์ด๋ฒคํŠธ ์†์„ฑ์— ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ฒฐ
  • ์—ฐ๊ฒฐ์„ ์ œ๊ฑฐํ•  ๋•Œ๋Š” ์ด๋ฒคํŠธ ์†์„ฑ์— null์„ ์ €์žฅ
    window.onload = function() {
        var header = document.getElementById('d');
    
        // header.onclick = click;
        header.onclick = function() {
            alert("๋ฐฉ์ฑ„๋ฏผ2");
        }
        // header.onclick = null; // ์—ฐ๊ฒฐ๋œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์ œ๊ฑฐ
    }
    
    function click() {
        alert("๋ฐฉ์ฑ„๋ฏผ");
        console.log("๋ฐฉ์ฑ„๋ฏผ");
    }ใ„ด


์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋˜๋ฉด catch ๋ธ”๋Ÿญ์œผ๋กœ ๋“ค์–ด์˜ค๊ณ  ์˜ˆ์™ธ์˜ ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ
ํด๋ฆญ ์‹œ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  e์—๋Š” ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. ์ด ์ •๋ณด๋“ค์„ ์ด์šฉํ•ด์„œ ์ฝ”๋”ฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

<h1 id="header">Click me!!!</h1>

$0.onclick; // null

$0.onclick = function(e) { // e์—๋Š” ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. 
    console.log(e); 
    console.log(e.srcElement); // ์ด๋ฒคํŠธ ์†Œ์Šค(์ œ์ผ ์ค‘์š”) ์–ด๋””์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. target์ด๋ž‘ ๋น„์Šทํ•จ
    console.log(e.target);
    console.log(e.pointerType); // mouse
}

$0.onclick = function(e) {
    e.srcElement.innerHTML = 'Chaemin'; // h1์ด Chaemin์œผ๋กœ ๋ฐ”๋€๋‹ค.
}

dir($0); // $0 = h1 ํƒœ๊ทธ

on์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒŒ ๋‹ค ์ด๋ฒคํŠธ ์†์„ฑ์ž„. ๋‚ด๋ฆฌ๋‹ค๋ณด๋ฉด onclick์ด null์ด ์•„๋‹Œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.


์ด๋ฒคํŠธ์˜ ์ดˆ๊ธฐ๊ฐ’์€ null์ด๋‹ค. ์—ฐ๊ฒฐ๋œ ํ•จ์ˆ˜๊ฐ€ ์—†์–ด์„œ ์•„๋ฌด๋Ÿฐ ๋™์ž‘์ด ์—†๋Š” ๊ฒƒ์ด์ง€ ์ด๋ฒคํŠธ๋Š” ํ•ญ์ƒ ์ผ์–ด๋‚˜๊ณ  ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์—ฐ๊ฒฐ๋œ ํ•จ์ˆ˜๋ฅผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ(์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ฒ˜๋ฆฌํ•˜๋Š” ์• )๋ผ๊ณ  ํ•œ๋‹ค.

์ธ๋ผ์ธ ์ด๋ฒคํŠธ ๋ชจ๋ธ

  • ํƒœ๊ทธ์— ์ง์ ‘ ์ด๋ฒคํŠธ ์†์„ฑ์„ ์ง€์ •(this๋Š” ํƒœ๊ทธ ์ž์‹ ์„ ์˜๋ฏธ)

    ์ด ๋ฐฉ์‹์€ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ (ํฌ์ธํ„ฐ, mouseover ์ œ์™ธํ•˜๊ณ ๋Š”..)

    <h1 id="header" onclick="alert(this);">Click me!!!</h1>
    // function() { alert(this); } function() {} ์ƒ๋žต๋œ ๊ฒƒ


Uploaded by N2T