๊ณผ์ œ

๋จผ์ € ์‚ดํŽด ๋ณผ ํ•จ์ˆ˜๋Š”

calculatorWinner() -> ์Šน์ž ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜. ์–ด๋–ป๊ฒŒ ์Šน์žํŒ๋ณ„ํ•˜๋Š”์ง€ ์ž˜ ํŒŒ์•…ํ•ด๋ณด์ž.

๋ฐฐ์—ด ์–ด๋–ป๊ฒŒ ๋„˜๊ฒจ์ฃผ๊ณ  ํ•˜๋Š”๊ฑด ๊ทธ ๋‹ค์Œ.

๊ทธ๋ฆฌ๊ณ  ์Šน์žํŒ๋ณ„์„ ์–ธ์ œํ•ด์•ผ๋˜๋Š๋ƒ? ์ด ํƒ€์ด๋ฐ์€ ์ž˜ ์ƒ๊ฐํ•ด๋ณด์ž.

Q. ๊ณผ์ œ์—์„œ css :before, :after ์„ ํƒ์ž ์–ด๋–ค์—ญํ• ?

css์—๋Š” box-sizing์ด๋ผ๋Š” ์†์„ฑ์ด ์žˆ๋Š”๋ฐ,

๋ธ”๋ก ์š”์†Œ๋Š” ์•ˆ์—์„œ๋ถ€ํ„ฐ padding, border, margin์˜ ์ˆœ์„œ๋Œ€๋กœ ์กด์žฌ.

๊ทผ๋ฐ, box-sizing ์†์„ฑ์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ๊ฐ’๋“ค์— ๋Œ€ํ•œ ๊ฐ’์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๊ณผ์ œ์—์„œ box-sizing: inherit; ์†์„ฑ์€ ๊ฐ ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” box-sizing์†์„ฑ์„ ์ผ๊ด€๋˜๊ฒŒ ๋งž์ถฐ์ค€๋‹ค๊ณ  ๋ณด๋ฉด ๋จ.

Reset-css

๋ธŒ๋ผ์šฐ์ € ๋ณ„๋กœ ๋‚ด์žฅ๋˜์–ด์žˆ๋Š” css ์„ค์ •๊ฐ’(h1์˜ ํฌ๊ธฐ์ฐจ์ด ๋“ฑ)์€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ๋‹ค. ๊ฐ ๋ธŒ๋ผ์šฐ์ €๋ณ„๋กœ ๋‹ค๋ฅธ ์„ค์ •๊ฐ’๋“ค์„ ๋งž์ถฐ์ฃผ๊ธฐ์—๋Š” ํž˜๋“œ๋ฏ€๋กœ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ css ์„ค์ •๊ฐ’์„ ์—†์• ์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ผ๊ด€๋˜๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ์“ด๋‹ค.

Q. calculateWinner ํ•จ์ˆ˜๋ถ€๋ถ„

if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c])

Q. ์•ž์˜ squares[a] && squares[a] ๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ฒƒ ์•„๋‹Œ๊ฐ€?

์ด ๋ถ€๋ถ„์—์„œ๋Š” 3ํŒŒํŠธ๊ฐ€ ์žˆ๋Š”๋ฐ,

์ผ๋‹จ ์—ฌ๊ธฐ์„œ ๋น„๊ต์—ฐ์‚ฐ์ž === ์šฐ์„ ์ˆœ์œ„๊ฐ€ &&์—ฐ์‚ฐ์ž๋ณด๋‹ค ํฌ๋‹ค

๊ทธ๋ž˜์„œ ๋จผ์„œ ===์—ฐ์‚ฐ์ž๊ฐ€ ์ˆ˜ํ–‰๋˜๊ณ  ๋‚œ ํ›„์— && ์—ฐ์‚ฐ์ž๊ฐ€ ์ž‘๋™๋˜๋Š”๋ฐ ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ €๋ฒˆ์ฃผ์ฐจ Operator Truthy Falsy์—์„œ ๋ดค๋˜ ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž.

&&์—ฐ์‚ฐ์ž๋Š” Falsy๋ฅผ ์ฐพ๋Š” ์—ฐ์‚ฐ์ž๋ผ๊ณ  ๋ณด๋ฉด ๋˜๋Š”๋ฐ,

if (squares[a] && ~~ )

์™€ ๊ฐ™์ด ๋˜๋ฉด์„œ, squares[a]๊ฐ€ Falsy์ธ์ง€ ์•„๋‹Œ์ง€ ์œ ๋ฌด๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ. ๋” ์ž์„ธํžˆ ๋งํ•˜๋ฉด squares[a]๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”์ง€๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ๊ฒƒ

์ข€ ๋” ๋””ํ…Œ์ผํ•œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๋ฉด,

var arr = [
  {
    title: "vanilla coding"
  }
];

if (arr[0].title) {
  // ToDo..
}

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋Š” ๋ฌธ์ œ ๋  ๊ฒƒ์ด ์—†๋‹ค.

ํ•˜์ง€๋งŒ

var arr = [
  /* 
  {
    title: "vanilla coding"
  }
  */
];

if (arr[0].title) {
  // ToDo..
}

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋Š” arr[0]์ด ์กด์žฌํ•˜์ง€ ์•Š์•„์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

arr[0]์ด ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— undefined๊ฐ€ ๋˜๊ณ ,

undefined.title์ด ๋˜๋ฉด์„œ ์• ๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

undefined๋Š” ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— dot notation์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋Ÿด๋•Œ, ๊ฐ„๋‹จํ•˜๊ฒŒ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด์„œ ์ด๋Ÿฌํ•œ ์• ๋Ÿฌ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š”๋ฐ,

var arr = [];

if (arr[0] && arr[0].title) {
  // ToDo
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐฐ์—ด์— ์ธ๋ฑ์‹ฑ์„ํ•˜๊ณ  ์†์„ฑ์„ ์ฐธ์กฐํ•˜๋Š” ๊ตฌ๋ฌธ ์•ž์— arr[0] && ์„ ๋„ฃ์–ด์„œ arr[0]์˜ ๊ฐ’์ด falsy์ธ์ง€ ํ™•์ธ ํ•œ ํ›„์— ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ.

arr[0]์ด falsy๋ฉด false๊ฐ’์œผ๋กœ if๋ฌธ์„ ๋ฒ—์–ด๋‚œ๋‹ค.

Q. ์Šคํฌ๋ฆฝํŠธ์—์„œ console.log์™€ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž๋„๊ตฌ์—์„œ console.log

Q. ์Šคํฌ๋ฆฝํŠธ์—์„œ console.log์™€ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž๋„๊ตฌ์—์„œ์˜ console.log๋กœ ๋˜‘๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ์ฐ์œผ๋ฉด ์—†๋‹ค๊ณ  ํ•จ.

์ด ๋ฌธ์ œ๋Š” ์šฐ๋ฆฌ๊ฐ€ parcel ๋ชจ๋“ˆ์„ ์จ์„œ ๊ทธ๋Ÿผ.

parcel๋กœ ๋นŒ๋“œํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ž‘์„ฑ๋œ ๋ณ€์ˆ˜๋ช…์ด๋‚˜ ์ด๋Ÿฐ๊ฒƒ๋“ค์ด ๋ณ€ํ™˜๋˜์–ด์„œ(๋ณดํ˜ธ?) ๋นŒ๋“œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ์ฝ˜์†”์ด ์ฐํžˆ์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ Console.log๋Œ€์‹  ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ ๋””๋ฒ„๊น…ํ•ด๋ณด์ž

getElementByClassName ์œ ์˜์‚ฌํ•ญ

๋งŒ์•ฝ, getElementByClassName์œผ๋กœ Element๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒฝ์šฐ, ์œ ์‚ฌ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

HTMLCollection

๊ทธ๋ž˜์„œ ์ฃผ์˜ํ•ด์•ผ๋˜๊ณ , ๋ฐฐ์—ด์ฒ˜๋Ÿผ ๋‹ค๋ค„์ค˜์•ผ ๋œ๋‹ค.

๋ฐฐ์—ด๊ณผ ๊ฐ™์ด [] indexing์„ ํ•ด์ค˜์•ผ ํ•จ.

์™œ ์œ ์‚ฌ๋ฐฐ์—ด๋กœ ๊ฐ€์ ธ์˜ค๋‚˜๋ฉด ClassName์€ ๊ฐ™์€ ClassName์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Element๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๊ฐ€์ ธ ์˜ค๋„๋ก ํ•ด์•ผ ๋˜๊ธฐ ๋•Œ๋ฌธ.

๋ฐ˜๋Œ€๋กœ id๋Š” page์— ํ•˜๋‚˜๋งŒ ์žˆ์–ด์•ผ ๋˜๋ฏ€๋กœ getElementById()๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์ธ ๊ฒƒ.

์‰ฝ๊ฒŒ ์ดํ•ดํ• ๋ ค๋ฉด, nodeList, htmlElementList๋“ฑ๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

event ๊ฐ์ฒด

element.addEventListener("click", function (event) {
  // ToDo
})

์œ„ ํ•จ์ˆ˜์— ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›๋Š” event๊ฐ์ฒด๋Š” event์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ๊ฐ์ฒด!

event ๊ฐ์ฒด์—์„œ target ๊ณผ currentTarget ์ฐจ์ด?

event ๊ฐ์ฒด์—์„œ, target์€ event๊ฐ€ ์‹ค์ œ๋กœ ์ผ์–ด๋‚˜๋Š” element๋ผ๊ณ  ๋ณด๋ฉด๋˜๊ณ ,

click์ด๋ฒคํŠธ๋ฉด ์‹ค์ œ clickํ•œ element

event.currentTarget์€ event๊ฐ€ ์‹ค์ œ ์žฅ์ฐฉ๋œ element๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

click ์ด๋ฒคํŠธ๋ฉด element.addEventListener() ๋กœ ์‹ค์ œ ์ด๋ฒคํŠธ ๋“ฑ๋กํ•œ element

์•„๋งˆ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—์„œ๋Š” target๊ณผ currentTarget์€ ๊ฐ™์„ ๊ฒƒ ๊ฐ™๋‹ค.

ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ,

<div class="outer">
  <div class="inner">
    
  </div>
</div>

๋‹ค์Œ๊ณผ ๊ฐ™์ด outer์— ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ์ž์‹์ธ inner์—๋„ ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ์ด ๋œ๋‹ค.

๊ทผ๋ฐ, inner์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ• ๋•Œ

target๊ณผ currentTarget์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

target : inner currentTarget : outer

๋ฐ”๋กœ event๋ฅผ ์ถ”๊ฐ€ํ•œ element ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” element๊ฐ€ ์žˆ์„ ๋•Œ, ์ด element์—์„œ event๊ฐ€ ๋ฐœ์ƒ๋˜์—ˆ์„ ๋•Œ,

๋‹ค์Œ ๊ฒฐ๊ณผ๋Š”?

var a = 3;

function foo() {
  var a = 2;
  console.log(a); // 2 ์ถœ๋ ฅ ๋™์ผ ํ•จ์ˆ˜ scope์— a๋ณ€์ˆ˜ ์กด์žฌ
}

foo();
console.log(a); // 3 ์ถœ๋ ฅ 

์—ฌ๊ธฐ์„œ Scope๋Š”

Global Scope
  • a = 3
  • function foo
foo ํ•จ์ˆ˜ Scope
  • a = 2

๋‹ค์Œ ๊ฒฐ๊ณผ๋Š”?

var a = 3;

function foo() {
  console.log(a); // undefined
  var a = 2;
}

foo();

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋Š”

fooํ•จ์ˆ˜๋‚ด๋ถ€์—์„œ console.log(a)๊ฐ€ ์‹คํ–‰ ๋˜๊ธฐ ์ด์ „์— a๊ฐ€ ์„ ์–ธ์ด ๋จผ์ € ๋˜๊ณ  (๊ฐ’๋งŒ ํ• ๋‹น๋˜์ง€ ์•Š์€ ์ƒํƒœ)๋กœ Hoisting์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ.

Hoisting์œผ๋กœ a๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜๊ธด ํ•˜๋‚˜ ๊ฐ’์€ ํ• ๋‹น๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ console.log(a)๊ฐ€ ์‹คํ–‰ ๋œ ๊ฒƒ.

๊ทธ๋ž˜์„œ javascript ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

var a = 3;

function foo() {
  var a; // undefined
  console.log(a);
  a = 2;
}

foo();

์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ ๋ฐ”๋€Œ๋Š”๊ฑด ์•„๋‹ˆ๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์•Œ์•„๋‘์ž.

๋‹ค์Œ ๊ฒฐ๊ณผ๋Š”?

var a = 5;

for (var i = 0; i < a; i++) {
  console.log(a);
}

console.log(i); // 5

i๊ฐ€ 5๊นŒ์ง€ ๊ฐ„๋‹ค์Œ for ์กฐ๊ฑด๋ฌธ์„ ํƒˆ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ.

๋‹ค์Œ ๊ฒฐ๊ณผ๋Š”?

var a = 1;

function bar() {
  function foo() {
    console.log(a); // 2์ถœ๋ ฅ
  }
  
  a = 2;
  
  foo();
}

bar();

์‹คํ–‰ ์ˆœ์„œ๋ฅผ ํŒŒ์•…ํ•˜๋ฉด ๋‹ต์€ ์‰ฝ๋‹ค.

fooํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ง์ „์— ์ด๋ฏธ a = 2๋กœ ๋ฐ”๊พธ์–ด ๋†“์•˜๊ธฐ ๋•Œ๋ฌธ.

์˜ˆ์ œ ์ฝ˜์†”์— ๋ณต๋ถ™ ํ–ˆ๋Š”๋ฐ undefined?

console.log() ์ฐ์€ ๊ฒƒ ๋ง๊ณ ๋„ ์ฝ˜์†”์— undefined๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ ์ด๋Š” ๋ณต๋ถ™ํ•œ ์†Œ์Šค์ฝ”๋“œ์˜ ๋ฆฌํ„ด๊ฐ’.

ํ•จ์ˆ˜ ์„ ์–ธ์˜ ๊ฒฐ๊ณผ๊ฐ’์€ undefined.

๊ฐ™์€ Scope์—์„œ ๋ณ€์ˆ˜ ๊ณ„์† ์„ ์–ธ?

function prep() {
  var value = 1;
  
  // ToDo
  
  var value = 2; // ์ด๋ ‡๊ฒŒ ํ•˜์ง€๋ง์ž.
  // ๊ฐ™์€ Scope์—์„œ๋Š” ์žฌ์„ ์–ธ ํ•˜์ง€๋ง๊ณ  ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋จ.
  value = 3;
  
  function inner() {
    var value = 5; // ๋‹ค๋ฅธ Scope์—์„œ๋Š” ํ•ด๋„ ์ƒ๊ด€ X.
  }
}

ํ˜ธ์ด์ŠคํŒ… ์˜ˆ์ œ

// var a;  <- Hoisting
function bar() {
  console.log(a); // undefined
}
bar();

var a = 1;

์ „์—ญ๋ณ€์ˆ˜ = ๊ฐ์ฒด๊ฐ์ฒด ์†์„ฑ. ๊ทธ๋Ÿผ delete?

delete window.something // false

์ „์—ญ ๊ฐ์ฒด์—์„œ์˜ ์†์„ฑ ์‚ญ์ œ๋Š” ์•ˆ๋œ๋‹ค.