์ด ๊ธ์ ํ๋ก ํธ์๋ ์ง๋ฌด ๋ฉด์ ์ง๋ฌธ๊ณผ ๊ด๋ จ๋ Github ์ ์ฅ์ front-end-interview-handbook ๋ฒ์ญ๋ณธ์ผ๋ก, ์ ์ฅ์์ Translations ํด๋์ ๋ด์ฉ๊ณผ ๋์ผํฉ๋๋ค.
ํ๋ก ํธ์๋ ๋ฉด์ ์ง๋ฌธ - JS ์ง๋ฌธ์ ๋ํ ํด์ค์
๋๋ค.
Pull Request๋ฅผ ํตํ ์ ์, ์์ ์์ฒญ ํ์ํฉ๋๋ค.
"use strict";
์ด ๋ฌด์์ธ๊ฐ์? ์ฌ์ฉ์ ์ฅ๋จ์ ์ด ๋ฌด์์ธ๊ฐ์?3
์ ๋ฐฐ์์๋ fizz
๋ฅผ ์ถ๋ ฅํ๊ณ , 5
์ ๋ฐฐ์์๋ buzz
๋ฅผ ์ถ๋ ฅํ๊ณ , 3
๊ณผ 5
์ ๋ฐฐ์์๋ fizzbuzz
๋ฅผ ์ถ๋ ฅํ๋ for loop๋ฅผ ๋ง๋์ธ์.load
์ด๋ฒคํธ์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋์? ์ด ์ด๋ฒคํธ์๋ ๋จ์ ์ด ์๋์? ๋ค๋ฅธ ๋์์ ์๊ณ ์๋์? ์๊ณ ์๋ค๋ฉด ์ ๊ทธ๊ฒ์ ์ฌ์ฉํ ๊ฑด๊ฐ์?same-origin ์ ์ฑ ์ JavaScript๊ฐ ๋๋ฉ์ธ ๊ฒฝ๊ณ๋ฅผ ๋์ด์ ์์ฒญํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. origin์ URI ์ฒด๊ณ, ํธ์คํธ ์ด๋ฆ, ํฌํธ ๋ฒํธ์ ์กฐํฉ์ผ๋ก ์ ์๋ฉ๋๋ค. ์ด ์ ์ฑ ์ ํ ํ์ด์ง์ ์ ์์ ์ธ ์คํฌ๋ฆฝํธ๊ฐ ํด๋น ํ์ด์ง์ DOM์ ํตํด ๋ค๋ฅธ ์น ํ์ด์ง์ ์ค์ํ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
duplicate([1, 2, 3, 4, 5]) // [1,2,3,4,5,1,2,3,4,5]
function duplicate(arr) {
return arr.concat(arr)
}
duplicate([1, 2, 3, 4, 5]) // [1,2,3,4,5,1,2,3,4,5]
"Ternary"๋ "์ผํญ"์ ๋ํ๋ด๊ณ ์ผํญ ํํ์์ ์ธ๊ฐ์ง ํผ์ฐ์ฐ์, ํ ์คํธ ์กฐ๊ฑด๋ฌธ, "then"ํํ์, "else"ํํ์์ ๋ฐ์ต๋๋ค. ์ผํญ ํํ์์ JavaScript์๋ง ํด๋น๋๋ ๊ฒ์ด ์๋๋ฉฐ ์ ์ด ๋ชฉ๋ก์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
"use strict";
์ด ๋ฌด์์ธ๊ฐ์? ์ฌ์ฉ์ ์ฅ๋จ์ ์ด ๋ฌด์์ธ๊ฐ์?'use strict'๋ ์ ์ฒด ์คํฌ๋ฆฝํธ๋ ๊ฐ๋ณ ํจ์์ ์๊ฒฉ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ฌ์ฉ๋๋ ๋ช ๋ น๋ฌธ์ ๋๋ค. Strict ๋ชจ๋๋ JavaScript ๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ฅ์ :
this
๋ ์ ์ญ ์ปจํ
์คํธ์์ undefined์
๋๋ค.๋จ์ :
function.caller
์ function.arguments
์ ๋ ์ด์ ์ ๊ทผํ ์ ์์ต๋๋ค.์ ๋ฐ์ ์ผ๋ก ์ฅ์ ์ด ๋จ์ ๋ณด๋ค ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๊ฒฉ ๋ชจ๋๊ฐ ์ฐจ๋จํ๋ ๊ธฐ๋ฅ์ ์์กดํ์ง ์์๋ ๋ฉ๋๋ค. ์๊ฒฉํ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
3
์ ๋ฐฐ์์๋ fizz
๋ฅผ ์ถ๋ ฅํ๊ณ , 5
์ ๋ฐฐ์์๋ buzz
๋ฅผ ์ถ๋ ฅํ๊ณ , 3
๊ณผ 5
์ ๋ฐฐ์์๋ fizzbuzz
๋ฅผ ์ถ๋ ฅํ๋ for loop๋ฅผ ๋ง๋์ธ์.Paul Irish์ FizzBuzz๋ฅผ ํ์ธํด๋ณด์ธ์.
for (let i = 1; i <= 100; i++) {
let f = i % 3 == 0,
b = i % 5 == 0
console.log(f ? (b ? 'FizzBuzz' : 'Fizz') : b ? 'Buzz' : i)
}
์ ๋ ์ธํฐ๋ทฐ ์ค์ ์์ ๊ฐ์ด ์ฐ๋ผ๊ณ ์กฐ์ธํ์ง๋ ์์ต๋๋ค. ๊ธธ์ง๋ง ๋ถ๋ช ํ ์ ๊ทผ ๋ฐฉ์์ ๊ณ ์ํ์ธ์. FizzBuzz์ ๋ ๋ค์ํ ๋ฒ์ ์ ๋ณด๋ ค๋ฉด ์๋์ ์ฐธ์กฐ ๋งํฌ๋ฅผ ํ์ธํ์ธ์.
๋ชจ๋ ์คํฌ๋ฆฝํธ๋ ์ ์ญ ์ค์ฝํ์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ๋ชจ๋ ์ฌ๋์ด ์ ์ญ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์ ์ํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ชจ๋ ํจํด (IIFEs)์ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ๋ก์ปฌ ๋ค์์คํ์ด์ค ๋ด์ ์บก์ํํ์ธ์.
load
์ด๋ฒคํธ์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋์? ์ด ์ด๋ฒคํธ์๋ ๋จ์ ์ด ์๋์? ๋ค๋ฅธ ๋์์ ์๊ณ ์๋์? ์๊ณ ์๋ค๋ฉด ์ ๊ทธ๊ฒ์ ์ฌ์ฉํ ๊ฑด๊ฐ์?load
์ด๋ฒคํธ๋ ๋ฌธ์๋ก๋ฉ ํ๋ก์ธ์ค๊ฐ ๋๋ ๋ ๋ฐ์๋ฉ๋๋ค. ์ด ์์ ์์ ๋ฌธ์์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ DOM์ ์๊ณ , ๋ชจ๋ ์ด๋ฏธ์ง, ์คํฌ๋ฆฝํธ, ๋งํฌ ๋ฐ ํ์ ํ๋ ์๋ก๋ฉ์ด ์๋ฃ๋ฉ๋๋ค.
DOM ์ด๋ฒคํธ DOMContentLoaded
๋ ํ์ด์ง์ DOM์ด ์์ฑ๋ ํ์ ๋ฐ์ํ์ง๋ง ๋ค๋ฅธ ๋ฆฌ์์ค๊ฐ ๋ก๋ฉ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ด๊ธฐํ๋๊ธฐ ์ ์ ์ ์ฒด ํ์ด์ง๊ฐ ๋ก๋๋ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ ํธ๋ฉ๋๋ค.
์๋๋ Grab Front End Guide์์ ๊ฐ์ ธ์จ ๊ฒ์ด๋ฉฐ, ์ฐ์ฐํ๋ ์ ๊ฐ ์์ฑํ์ต๋๋ค!
์น ๊ฐ๋ฐ์๋ ์์ฆ ์น ์ฌ์ดํธ๊ฐ ์๋ ์น ์ฑ์ผ๋ก ์ ์ํ ์ ํ์ ์ธ๊ธํฉ๋๋ค. ๋ ๊ฐ์ง ์ฉ์ด ์ฌ์ด์๋ ์๊ฒฉํ ์ฐจ์ด๋ ์์ง๋ง, ์น ์ฑ์ ๋ํํ, ๋์ ์ธ ๊ฒฝํฅ์ด ์์ด ์ฌ์ฉ์๊ฐ ์์ ์ ์ํํ๊ณ ์์ ์ ๋ํ ์๋ต์ ๋ฐ์ ์ ์์ต๋๋ค. ์ ํต์ ์ผ๋ก, ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์์ HTML์ ๋ฐ์ ๋ ๋๋งํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ URL๋ก ์ด๋ํ๋ฉด, ์ ์ฒดํ์ด์ง ์๋ก๊ณ ์นจ์ด ํ์ํ๋ฉฐ ์๋ฒ๋ ์ํ์ด์ง์ ๋ํด ์ HTML์ ๋ณด๋ ๋๋ค. ์ด๋ฅผ server-side rendering์ด๋ผ๊ณ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ํ๋ SPA์์๋ ๋์ client-side rendering์ด ์ฌ์ฉ๋ฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ์คํฌ๋ฆฝํธ(ํ๋ ์์ํฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ฑ ์ฝ๋) ๋ฐ ์คํ์ผ์ํธ์ ํจ๊ป ์๋ฒ์ ์ด๊ธฐ ํ์ด์ง๋ฅผ ๋ก๋ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๋ฉด ํ์ด์ง ์๋ก๊ณ ์นจ์ด ๋ฐ์ํ์ง ์์ต๋๋ค. ํ์ด์ง์ URL์ HTML5 History API๋ฅผ ํตํด ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก JSON ํ์์ ์ ํ์ด์ง์ ํ์ํ ์ ๋ฐ์ดํฐ๋ ๋ธ๋ผ์ฐ์ ์์ AJAX ์์ฒญ์ ํตํด ์๋ฒ๋ก ์ ์ก๋ฉ๋๋ค. SPA๋ ์ด๊ธฐ ํ์ด์ง ๋ก๋ฉ์์ ๋ฏธ๋ฆฌ ๋ค์ด๋ก๋๋ JavaScript๋ฅผ ํตํด ํ์ด์ง๋ฅผ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค. ์ด ๋ชจ๋ธ์ ๋ค์ดํฐ๋ธ ๋ชจ๋ฐ์ผ ์ฑ์ ์๋ ๋ฐฉ์๊ณผ ์ ์ฌํฉ๋๋ค.
์ฅ์ ๋ค:
๋จ์ ๋ค:
Promise๋ ์ด๋ ์์ ์ resolve๋ ๊ฐ ๋๋ resolve๋์ง ์์ ์ด์ (์: ๋คํธ์ํฌ ์ค๋ฅ๊ฐ ๋ฐ์) ์ค ํ๋์ ๊ฐ์ ์์ฑํ ์ ์๋ ๊ฐ์ฒด์ ๋๋ค. promise๋ fulfilled, rejected, pending 3๊ฐ์ง ์ํ ์ค ํ๋์ผ ์ ์์ต๋๋ค. promise ์ฌ์ฉ์๋ ์ฝ๋ฐฑ์ ๋ถ์ฌ์ fulfill๋ ๊ฐ์ด๋ reject๋ ์ด์ ๋ฅผ ์ฒ๋ฆฌํ ์ โโ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ polyfill์ $.deferred
, Q, Bluebird ์
๋๋ค๋ง, ๋ชจ๋๊ฐ ์คํ์ ๋ฐ๋ฅด๋ ๊ฒ์ ์๋๋๋ค. ES2015๋ ์ฆ์ ์ฌ์ฉํ ์ ์๋ Promise๋ฅผ ์ง์ํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์์ฆ์ polyfill์ด ํ์ํ์ง ์์ต๋๋ค.
์ฅ์
.then()
์ ์ด์ฉํ์ฌ ๊ฐ๋
์ฑ ์ข์ ์ฐ์์ ์ธ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.Promise.all()
์ ์ฌ์ฉํ์ฌ ๋ณ๋ ฌ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.๋จ์
JavaScript๋ก ์ปดํ์ผ๋๋ ์ธ์ด์ ์๋ก CoffeeScript, Elm, ClojureScript, PureScript, TypeScript๊ฐ ์์ต๋๋ค.
์ฅ์ :
๋จ์ :
์ค์ง์ ์ผ๋ก ES2015๋ JavaScript๋ฅผ ํฌ๊ฒ ๊ฐ์ ํ์ฌ ์์ฑํ๊ธฐ๊ฐ ํจ์ฌ ์ฌ์์ก์ต๋๋ค. ์์ฆ์ CoffeeScript๊ฐ ํ์์ฑ์ ๋๋ผ์ง ๋ชปํฉ๋๋ค.
debugger
statementconsole.log
debugging์ค๋ธ์ ํธ์ ๊ฒฝ์ฐ:
for-in
๋ฐ๋ณต - for (var property in obj) { console.log(property); }
. ๊ทธ๋ฌ๋, ์ด๋ ์์๋ ์์ฑ๋ ๋ฐ๋ณต๋๋ฉฐ, ์ฌ์ฉํ๊ธฐ ์ ์ obj.hasOwnProperty(property)
์ฒดํฌ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.Object.keys()
- Object.keys(obj).forEach(function (property) { ... })
. Object.keys()
๋ ์ ๋ฌํ๋ ๊ฐ์ฒด์ ์ด๊ฑฐ ๊ฐ๋ฅํ ๋ชจ๋ ์์ฑ์ ๋์ดํ๋ ์ ์ ๋ฉ์๋์
๋๋ค.Object.getOwnPropertyNames()
- Object.getOwnPropertyNames(obj).forEach(function (property) { ... })
. Object.getOwnPropertyNames()
๋ ์ ๋ฌํ๋ ๊ฐ์ฒด์ ์ด๊ฑฐ ๊ฐ๋ฅํ ์์ฑ๊ณผ ์ด๊ฑฐ๋ถ๊ฐ๋ฅํ ๋ชจ๋ ์์ฑ์ ๋์ดํ๋ ์ ์ ๋ฉ์๋์
๋๋ค.๋ฐฐ์ด์ ๊ฒฝ์ฐ:
for
๋ฐ๋ณต - for (var i = 0; i < arr.length; i++)
. ์ฌ๊ธฐ์ ์๋ ์ผ๋ฐ์ ์ธ ํจ์ ์ var
์ด ํจ์ ์ค์ฝํ๊ณ ๋ธ๋ก ์ค์ฝํ๊ฐ ์๋๋ฉฐ, ๋๋ถ๋ถ ๋ธ๋ก ์ค์ฝํ์ ๋ฐ๋ณต์ ๋ณ์๋ฅผ ์ํ ๊ฒ์ด๋ผ๋ ์ ์
๋๋ค. ES2015์๋ ๋ธ๋ก ๋ฒ์๊ฐ ์๋ let
์ด ์ถ๊ฐ๋๊ณ , ์ด๋ฅผ ๋์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค. for (let i = 0; i < arr.length; i++)
.forEach
- arr.forEach(function (el, index) { ... })
. ํ์ํ ๊ฒ์ด ๋ฐฐ์ด์ ์์๋ผ๋ฉด index
๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด ๊ตฌ๋ฌธ์ด ๋ ํธ๋ฆฌ ํ ์ โโ์์ต๋๋ค. ๋ํ every
๊ณผ some
๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๋ฐ๋ณต์ ์ผ์ฐ ๋๋ผ ์ ์์ต๋๋ค.for-of
๋ฐ๋ณต - for (let elem of arr) { ... }
. ES6๋ String
, Array
, Map
, Set
๋ฑ๊ณผ ๊ฐ์ iterable protocol์ ์ค์ํ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณต ํ ์ ์๊ฒ ํด์ฃผ๋ ์๋ก์ด for-of
๋ฃจํ๋ฅผ ๋์
ํ์ต๋๋ค. for
๋ฃจํ์ ์ฅ์ ์ ๋ฃจํ์์ ๋ฒ์ด๋ ์ ์๋ค๋ ๊ฒ์ด๊ณ , forEach()
์ ์ฅ์ ์ ์นด์ดํฐ ๋ณ์๊ฐ ํ์ ์๊ธฐ ๋๋ฌธ์ for
๋ฃจํ๋ณด๋ค ๊ฐ๊ฒฐํ๋ค๋ ๊ฒ์
๋๋ค. for-of
๋ฃจํ๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ฃจํ์์ ๋น ์ ธ ๋์ฌ ์๋ ์๊ณ ๋ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ๋ ์ป์ ์ ์์ต๋๋ค.๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ์ ๋ .forEach
๋ฉ์๋๋ฅผ ์ ํธํ์ง๋ง, ๋ฌด์์ ํ๋๋์ ๋ฐ๋ผ์ ๊ฐ ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ES6 ์ด์ ์๋ for
๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฃจํ๋ฅผ ์กฐ๊ธฐ ์ข
๋ฃํด์ผ ํ ๋ break
๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด์ ES6์์๋ for-of
๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ํ ํ ์ ์์ต๋๋ค. ๋ฃจํ ๋น ๋ฐ๋ณต์๋ฅผ ๋ ๋ฒ ์ด์ ๋๋ฆฌ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ ์ฐ์ฑ์ด ๋ ํ์ํ๋ค๋ฉด, for
๋ฃจํ๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค.
๋ํ, for-of
๋ฃจํ๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ ๋ฐฐ์ด ์์์ ์ธ๋ฑ์ค์ ๊ฐ์ ๋ชจ๋ ์ ๊ทผํด์ผํ๋ ๊ฒฝ์ฐ ES6 Array์ entries()
๋ฉ์๋์ destructuring์ ์ฌ์ฉํ๋ฉด๋ฉ๋๋ค.
const arr = ['a', 'b', 'c'];
for (let [index, elem] of arr.entries()) {
console.log(index, ': ', elem);
}
ํญ์ ์ข์ ๋ฒ์ญ๊ธ ๊ฐ์ฌํด์~ ๊ณ ์ํ์ จ์ต๋๋ค!