μ΄ κΈμ νλ‘ νΈμλ μ§λ¬΄ λ©΄μ μ§λ¬Έκ³Ό κ΄λ ¨λ Github μ μ₯μ front-end-interview-handbook λ²μλ³ΈμΌλ‘, μ μ₯μμ Translations ν΄λμ λ΄μ©κ³Ό λμΌν©λλ€.
νλ‘ νΈμλ λ©΄μ μ§λ¬Έ - JS μ§λ¬Έμ λν ν΄μ€μ
λλ€.
Pull Requestλ₯Ό ν΅ν μ μ, μμ μμ² νμν©λλ€.
this
κ° JavaScriptμμ μ΄λ»κ² μλνλμ§ μ€λͺ
νμΈμ.function foo(){ }();
λ₯Ό IIFEλ‘ λ§λ€κΈ° μν΄μλ 무μμ λ°κΏμΌνλμ?null
, undefined
, undeclared
μ μ°¨μ΄μ μ 무μμΈκ°μ? μ΄λ»κ² μ΄ μνλ€μ λν νμΈμ ν κ²μΈκ°μ?.forEach
루νμ .map()
루ν μ¬μ΄μ μ£Όμ μ°¨μ΄μ μ μ€λͺ
ν μ μλμ? μ λ μ€ νλλ₯Ό μ νν κ²μΈκ°μ?function Person(){}
, var person = Person()
, var person = new Person()
μ μ°¨μ΄μ μ 무μμΈκ°μ?.call
κ³Ό .apply
μ μ°¨μ΄μ μ 무μμΈκ°μ?μ΄λ²€νΈ μμμ μ΄λ²€νΈ 리μ€λλ₯Ό νμ μμμ μΆκ°νλ λμ μμ μμμ μΆκ°νλ κΈ°λ²μ λλ€. 리μ€λλ DOMμ event bubblingμΌλ‘ μΈν΄ νμ μμμμ μ΄λ²€νΈκ° λ°μλ λλ§λ€ μ€νλ©λλ€. μ΄ κΈ°μ μ μ΄μ μ λ€μκ³Ό κ°μ΅λλ€.
this
κ° JavaScriptμμ μ΄λ»κ² μλνλμ§ μ€λͺ
νμΈμ.this
λ κ°λ¨νκ² μ€λͺ
νκΈ° μ΄λ ΅μ΅λλ€. JavaScriptμμ κ°μ₯ νΌλμ€λ¬μ΄ κ°λ
μ€ νλμ
λλ€. λλ΅ μ€λͺ
νλ©΄ this
μ κ°μ ν¨μκ° νΈμΆλλ λ°©μμ λ°λΌ λ¬λΌμ§λλ€. μ¨λΌμΈμ λ§μ μ€λͺ
μ μ½μλλ°, Arnav Aggrawalμ μ€λͺ
μ΄ κ°μ₯ λͺ
ννμ΅λλ€.
λ€μ κ·μΉκ³Ό κ°μ΅λλ€.
new
ν€μλλ₯Ό μ¬μ©νλ κ²½μ°, ν¨μ λ΄λΆμ μλ this
λ μμ ν μλ‘μ΄ κ°μ²΄μ
λλ€.apply
, call
, bind
κ° ν¨μμ νΈμΆ/μμ±μ μ¬μ©λλ κ²½μ°, ν¨μ λ΄μ this
λ μΈμλ‘ μ λ¬λ κ°μ²΄μ
λλ€.obj.method()
μ κ°μ΄ ν¨μλ₯Ό λ©μλλ‘ νΈμΆνλ κ²½μ°, this
λ ν¨μκ° νλ‘νΌν°μΈ κ°μ²΄μ
λλ€.this
λ μ μ κ°μ²΄μ
λλ€. λΈλΌμ°μ μμλ window
κ°μ²΄μ
λλ€. μ격 λͺ¨λ('use strict'
) μΌ κ²½μ°, this
λ μ μ κ°μ²΄ λμ undefined
κ° λ©λλ€.this
κ°μ μ€μ ν©λλ€.this
κ°μ λ°μ΅λλ€.μμΈν μ€λͺ μ Mediumμ κΈμ μ°Έμ‘°νμΈμ.
μ΄λ λ§€μ° μΌλ°μ μΈ JavaScript μΈν°λ·° μ§λ¬Έμ
λλ€. λͺ¨λ JavaScript κ°μ²΄λ λ€λ₯Έ κ°μ²΄μ λν μ°Έμ‘°μΈ prototype
νλ‘νΌν°λ₯Ό κ°μ§κ³ μμ΅λλ€. κ°μ²΄μ νλ‘νΌν°μ μ κ·Όν λ, ν΄λΉ κ°μ²΄μ ν΄λΉ νλ‘νΌν°κ° μμΌλ©΄ JavaScript μμ§μ κ°μ²΄μ prototype
κ³Ό prototype
μ prototype
λ±μ λ³΄κ³ νλ‘νΌν° μ μκ° μμ λκΉμ§ μ°Ύκ³ , λ§μ½ κ°μ²΄μ νλ‘νΌν°μ μ κ·Όν λ ν΄λΉ κ°μ²΄μ ν΄λΉ νλ‘νΌν°κ° μμΌλ©΄ νλ‘ν νμ
μ²΄μΈ μ€ νλμ μκ±°λ νλ‘ν νμ
체μΈμ λμ λλ¬ν λκΉμ§ μ°Ύμ΅λλ€. μ΄ λμμ κ³ μ μ μΈ μμμ νλ΄λ΄μ§λ§, μ€μ λ‘ μμλ³΄λ€ μμμ λ κ°κΉμ΅λλ€.
λ κ°μ§ λͺ¨λ ES2015κ° λ±μ₯νκΈ° μ κΉμ§ JavaScriptμ κΈ°λ³Έμ μΌλ‘ μ‘΄μ¬νμ§ μλ λͺ¨λ μμ€ν μ ꡬννλ λ°©λ²μ λλ€. CommonJSλ λκΈ°μμΈ λ°λ©΄ AMD(Asynchronous Module Definition - λΉλκΈ°μ λͺ¨λ μ μ)λ λΆλͺ ν λΉλκΈ°μμ λλ€. CommonJSλ μλ²μ¬μ΄λ κ°λ°μ μΌλμ λκ³ μ€κ³λμμΌλ©°, AMDλ λͺ¨λμ λΉλκΈ° λ‘λ©μ μ§μνλ―λ‘ λΈλΌμ°μ μ©μΌλ‘ λ λ§μ΄ μ¬μ©λ©λλ€.
AMDμ κ΅¬λ¬Έμ΄ λ§€μ° μ₯ν©νκ³ , CommonJSμ λ€λ₯Έ μΈμ΄μ²λΌ import λ¬Έμ μμ±νλ μ€νμΌμ λ κ°κΉμ΅λλ€. λλΆλΆμ κ²½μ° AMDλ₯Ό νμλ‘ νμ§ μμ΅λλ€. λͺ¨λ JavaScriptλ₯Ό μ°κ²°λ νλμ λ²λ€ νμΌλ‘ μ 곡νλ©΄ λΉλκΈ° λ‘λ© μμ±μ μ΄μ μ λ릴 μ μκΈ° λλ¬Έμ λλ€. λν CommonJS ꡬ문μ λͺ¨λ μμ±μ λ Έλ μ€νμΌμ κ°κΉκ³ ν΄λΌμ΄μΈνΈ μ¬μ΄λμ μλ²μ¬μ΄λ JavaScript κ°λ° μ¬μ΄λ₯Ό μ νν λ λ¬Έλ§₯ μ ν μ€λ² ν€λκ° μ μ΅λλ€.
ES2015 λͺ¨λμ΄ λκΈ°μ λ° λΉλκΈ°μ λ‘λ©μ λͺ¨λ μ§μνλ κ²μ΄ λ°κ°μ΄ κ²μ λ§μΉ¨λ΄ νλμ μ κ·Ό λ°©μλ§ κ³ μν μ μλ€λ μ μ λλ€. λΈλΌμ°μ μ λ Έλμμ μμ ν μλλμ§λ μμ§λ§, μΈμ λ νΈλμ€νμΌλ¬λ₯Ό μ¬μ©νμ¬ μ½λλ₯Ό λ³νν μ μμ΅λλ€.
function foo(){ }();
λ₯Ό IIFEλ‘ λ§λ€κΈ° μν΄μλ 무μμ λ°κΏμΌνλμ?IIFEλ μ¦μ ν¨μ νΈμΆ ννμ(Immediately Invoked Function Expressions)μ μλ―Έν©λλ€. JavaScript parserλ function foo(){ }();
μ function foo(){ }
μ ();
λ‘ μ½μ΅λλ€. μ μλ ν¨μ μ μΈμ΄λ©° νμ(ν μμ μ€κ΄νΈ)λ ν¨μλ₯Ό νΈμΆνλ €κ³ μλνμ§λ§, μ΄λ¦μ΄ μ§μ λμ§ μμκΈ° λλ¬Έμ Uncaught SyntaxError : Unexpected token )
μ λ°μμν΅λλ€.
κ΄νΈλ₯Ό μΆκ°νμ¬ κ³ μΉλ λ κ°μ§ λ°©λ²μ΄ μμ΅λλ€: (function foo(){ })()
κ·Έλ¦¬κ³ (function foo(){ }())
. function
μΌλ‘ μμνλ λ¬Έμ ν¨μ μ μΈμΌλ‘ κ°μ£Όλ©λλ€. μ΄ ν¨μλ₯Ό ()
λ‘ λ¬ΆμΌλ©΄ ν¨μ μμ΄ λκ³ , μ΄λ κ²νλ©΄ λ€μ ()
λ‘ ν¨μλ₯Ό μ€νν μ μμ΅λλ€. μ΄λ¬ν ν¨μλ μ μ λ²μμ λ
ΈμΆλμ§ μμΌλ©°, λ³Έλ¬Έ λ΄μμ μ΄ ν¨μ μ체λ₯Ό μ°Έμ‘°ν νμκ° μλ κ²½μ°μλ ν΄λΉ ν¨μμ μ΄λ¦μ μλ΅ν μλ μμ΅λλ€.
void function foo(){ }();
μ²λΌ void
μ°μ°μλ₯Ό μ¬μ©ν μλ μμ΅λλ€. λΆννλ, μ΄λ¬ν μ κ·Όλ°©μμλ ν κ°μ§ λ¬Έμ κ° μμ΅λλ€. μ£Όμ΄μ§ ννμμ νκ°λ νμ undefined
μ΄λ―λ‘, IIFE ν¨μκ° λ¬΄μΈκ°λ₯Ό λ°ννλ©΄, μ¬μ©ν μ μμ΅λλ€. μ:
// Don't add JS syntax to this code block to prevent Prettier from formatting it.
const foo = void function bar() { return 'foo'; }();
console.log(foo); // undefined
null
, undefined
, undeclared
μ μ°¨μ΄μ μ 무μμΈκ°μ? μ΄λ»κ² μ΄ μνλ€μ λν νμΈμ ν κ²μΈκ°μ?Undeclared λ³μλ μ΄μ μ var
, let
, const
λ₯Ό μ¬μ©νμ¬ μμ±λμ§ μμ μλ³μμ κ°μ ν λΉν λ μμ±λ©λλ€. Undeclared
λ³μλ νμ¬ λ²μ μΈλΆμ μ μμΌλ‘ μ μλ©λλ€. strict λͺ¨λμμλ Undeclared
λ³μμ ν λΉνλ €κ³ ν λ, ReferenceError
κ° λ°μν©λλ€. Undeclared
λ³μλ μ μ λ³μμ²λΌ μ’μ§ μμ΅λλ€. μ΄κ²λ€μ λͺ¨λ μ¬μ©μ νΌνμΈμ! μ΄λ₯Ό κ²μ¬νλ €λ©΄, μ¬μ©ν λ try
/catch
λΈλ‘μ κ°μΈμΈμ.
function foo() {
x = 1 // strict λͺ¨λμμ ReferenceErrorλ₯Ό λ°μμν΅λλ€.
}
foo()
console.log(x) // 1
undefined
λ³μλ μ μΈλμμ§λ§, κ°μ΄ ν λΉλμ§ μμ λ³μμ
λλ€. μ΄λ undefined
νμ
μ
λλ€. ν¨μκ° μ€ν κ²°κ³Όμ λ°λΌ μ무κ°λ λ°ννμ§ μμΌλ©΄, λ³μμ ν λΉλλ©°, κ·Έ λ³μκ° undefined
κ°μ κ°μ΅λλ€. μ΄λ₯Ό κ²μ¬νκΈ° μν΄, μ격ν (===
) μ°μ°μ λλ typeof
μ undefined
λ¬Έμμ΄μ μ¬μ©νμ¬ λΉκ΅νμΈμ. νμΈμ μν΄ μΆμ νλ± μ°μ°μ(==
)λ₯Ό μ¬μ©ν΄μλ μλλ©°, μ΄λ κ°μ΄ null
μ΄λ©΄ true
λ₯Ό λ°νν©λλ€.
var foo
console.log(foo) // undefined
console.log(foo === undefined) // true
console.log(typeof foo === 'undefined') // true
console.log(foo == null) // true. μ³μ§μμ΅λλ€. μ΄λ κ² μ¬μ©νμ§ λ§μΈμ.
function bar() {}
var baz = bar()
console.log(baz) // undefined
null
μΈ λ³μλ null
κ°μ΄ λͺ
μμ μΌλ‘ ν λΉλ κ²μ
λλ€. κ·Έκ²μ κ°μ λνλ΄μ§ μμΌλ©°, λͺ
μμ μΌλ‘ ν λΉλλ€λ μ μμ undefined
μ λ€λ¦
λλ€. null
μ 체ν¬νκΈ° μν΄μ λ¨μν μμ νλ± μ°μ°μ(===
)λ₯Ό μ¬μ©νμ¬ λΉκ΅νλ©΄ λ©λλ€. μμ κ°μ΄, μΆμ νλ± μ°μ°μ (==
)λ₯Ό μ¬μ©ν΄μλ μλλ©°, κ°μ΄ undefined
μ΄λ©΄ true
λ₯Ό λ°νν©λλ€.
var foo = null
console.log(foo === null) // true
console.log(foo == undefined) // true. μ³μ§μμ΅λλ€. μ΄λ κ² μ¬μ©νμ§ λ§μΈμ.
κ°μΈμ μ΅κ΄μΌλ‘, μ λ λ³μλ₯Ό μ μΈνμ§ μκ±°λ(undeclared) ν λΉνμ§ μμ μν(unassigned)λ‘ λμ§ μμ΅λλ€. μμ§ μ¬μ©νμ§ μμΌλ €λ κ²½μ°, μ μΈν νμ λͺ
μμ μΌλ‘ null
μ ν λΉν κ²μ
λλ€. μμ
μ linterλ₯Ό μ¬μ©νλ©΄, μΌλ°μ μΌλ‘ Undeclared λ³μλ₯Ό μ°Έμ‘°νμ§λ μλμ§ νμΈν μ μμ΅λλ€.
ν΄λ‘μ λ ν¨μμ κ·Έ ν¨μκ° μ μΈλ λ μ컬 νκ²½μ μ‘°ν©μ λλ€. "λ μ컬"μ λ μ컬 λ²μ μ§μ μ΄ λ³μκ° μ¬μ© κ°λ₯ν μμΉλ₯Ό κ²°μ νκΈ° μν΄ μμ€ μ½λ λ΄μμ λ³μκ° μ μΈλ μμΉλ₯Ό μ¬μ©νλ€λ μ¬μ€μ λνλ λλ€. ν΄λ‘μ λ μΈλΆ ν¨μκ° λ°νλ νμλ μΈλΆ ν¨μμ λ³μ λ²μ 체μΈμ μ κ·Όν μ μλ ν¨μμ λλ€.
μ ν΄λ‘μ λ₯Ό μ¬μ©ν©λκΉ?
.forEach
루νμ .map()
루ν μ¬μ΄μ μ£Όμ μ°¨μ΄μ μ μ€λͺ
ν μ μλμ? μ λ μ€ νλλ₯Ό μ νν κ²μΈκ°μ?μ΄ λ ν¨μμ μ°¨μ΄μ μ μ΄ν΄νκΈ° μν΄ κ° ν¨μκ° λ¬΄μμ νλμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
forEach
const a = [1, 2, 3]
const doubled = a.forEach((num, index) => {
// numλ indexλ‘ λ¬΄μΈκ° ν©λλ€.
})
// doubled = undefined
map
const a = [1, 2, 3]
const doubled = a.map(num => {
return num * 2
})
// doubled = [2, 4, 6]
.forEach
μ .map()
μ κ°μ₯ ν° μ°¨μ΄μ μ .map()
μ΄ μλ‘μ΄ λ°°μ΄μ λ°ννλ€λ κ²μ
λλ€. κ²°κ³Όκ° νμνμ§λ§ μλ³Έ λ°°μ΄μ λ³κ²½νκ³ μΆμ§ μμΌλ©΄, .map()
μ΄ νμ€ν μ νμ
λλ€. λ¨μν λ°°μ΄μ λ°λ³΅ν νμκ° μλ€λ©΄, forEach
κ° μ’μ μ νμ
λλ€.
μ΅λͺ ν¨μλ IIFEλ‘ μ¬μ©λμ΄ μ§μ λ²μ λ΄μμ μΌλΆ μ½λλ₯Ό μΊ‘μννλ―λ‘ μ μΈλ λ³μκ° μ μ λ²μλ‘ λμΆλμ§ μμ΅λλ€.
(function() {
// μ½λ
})()
ν λ² μ¬μ©λκ³ λ€λ₯Έ κ³³μμλ μ¬μ©ν νμκ° μλ μ½λ°±μΌλ‘ μ¬μ©λ©λλ€. ν¨μ 본체λ₯Ό μ°ΎκΈ° μν΄ λ€λ₯Έ κ³³μ μ°Ύμλ³Ό νμ μμ΄ μ½λλ₯Ό νΈμΆνλ μ½λ λ°λ‘ μμ νΈλ€λ¬κ° μ μλμ΄ μμΌλ©΄ μ½λκ° λ³΄λ€ λ 립μ μ΄κ³ μ½κΈ° μ½κ² λ³΄μΌ κ²μ λλ€.
setTimeout(function() {
console.log('Hello world!')
}, 1000)
ν¨μν νλ‘κ·Έλλ° λλ Lodashμ λν μΈμ(μ½λ°±κ³Ό μ μ¬)λ‘ μ¬μ©.
const arr = [1, 2, 3]
const double = arr.map(function(el) {
return el * 2
})
console.log(double) // [2, 4, 6]
κ³Όκ±°μλ Backbone λͺ¨λΈμ λ§λ€κ³ κ·Έ λͺ¨λΈμ λ©μλλ₯Ό μ°κ²°νλ λ± OOP μ κ·Ό λ°©μμ μ₯λ €νλ λͺ¨λΈμ Backbone μ μ¬μ©νμ΅λλ€.
λͺ¨λ ν¨ν΄μ μ¬μ νββ νλ₯νμ§λ§, μμ¦μλ React/Redux κΈ°λ°μ Flux μν€ν μ²λ₯Ό μ¬μ©ν©λλ€. μ΄ μν€ν μ²λ λ¨λ°©ν₯ νλ‘κ·Έλλ° λ°©μμ κΆμ₯ν©λλ€. μ λ νλ²ν κ°μ²΄λ₯Ό μ¬μ©νμ¬ μμ© νλ‘κ·Έλ¨μ λͺ¨λΈμ νννκ³ μ΄λ¬ν κ°μ²΄λ₯Ό μ‘°μνλ μ νΈλ¦¬ν° μμ ν¨μλ₯Ό μμ±ν©λλ€. μνλ λ€λ₯Έ Redux μμ© νλ‘κ·Έλ¨μμμ λ§μ°¬κ°μ§λ‘ action λ° reducerλ₯Ό μ¬μ©νμ¬ μ‘°μλ©λλ€.
κ°λ₯ν κ²½μ° κ³ μ μ μΈ μμμ μ¬μ©νμ§ μμ΅λλ€. μ λ μ΄ κ·μΉλ€μ μ μ§ν©λλ€.
λ΄μ₯ κ°μ²΄λ ECMAScript μ¬μμ μ μλ JavaScript μΈμ΄μ μΌλΆμΈ κ°μ²΄μ
λλ€. (μ: String
, Math
, RegExp
, Object
, Function
λ±)
νΈμ€νΈ κ°μ²΄λ window
, XMLHTTPRequest
λ±κ³Ό κ°μ΄ λ°νμ νκ²½ (λΈλΌμ°μ or λ
Έλ)μ μν΄ μ 곡λ©λλ€.
function Person(){}
, var person = Person()
, var person = new Person()
μ μ°¨μ΄μ μ 무μμΈκ°μ?μ΄ μ§λ¬Έμ κ΅μ₯ν΄ μ 맀ν©λλ€. μ§λ¬Έμ μλμ λν μ μ μ΅μ μ μΆμΈ‘μ JavaScriptμ μμ±μμ λν΄ λ¬»λ κ²μ
λλ€. μλ°ν λ§νλ©΄, function Person(){}
μ μ μμ μΈ ν¨μ μ μΈμΌ λΏμ
λλ€. μ΄ μ»¨λ²€μ
μ ν¨μμμ±μλ‘ μ¬μ©νκΈ° μν΄ ν¨μμ΄λ¦μ PascalCaseλ₯Ό μ¬μ©ν©λλ€.
var person = Person()
μ μμ±μκ° μλλ©° Person
μ ν¨μλ‘ νΈμΆν©λλ€. ν¨μλ₯Ό μμ±μλ‘ μ¬μ©νλ €λ κ²½μ°μ μ΄λ κ² νΈμΆνλ κ²μ μΌλ°μ μΈ μ€μμ
λλ€. μΌλ°μ μΌλ‘ μμ±μλ μ무κ²λ λ°ννμ§ μμΌλ―λ‘ μΌλ° ν¨μμ²λΌ μμ±μλ₯Ό νΈμΆνλ©΄ undefined
κ° λ°νλκ³ μ§μ λ λ³μμ ν λΉλ©λλ€.
var person = new Person()
μ Person.prototype
μ μμλ°μ new
μ°μ°μλ₯Ό μ¬μ©νμ¬ Person
κ°μ²΄μ μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€. λ λ€λ₯Έ λ°©λ²μ Object.create
λ₯Ό μ¬μ©νλ κ²μ
λλ€: Object.create(Person.prototype)
.
function Person(name) {
this.name = name
}
var person = Person('John')
console.log(person) // undefined
console.log(person.name) // Uncaught TypeError: Cannot read property 'name' of undefined
var person = new Person('John')
console.log(person) // Person { name: "John" }
console.log(person.name) // "john"
.call
κ³Ό .apply
μ μ°¨μ΄μ μ 무μμΈκ°μ?.call
κ³Ό .apply
λ λͺ¨λ ν¨μλ₯Ό νΈμΆνλλ° μ¬μ©λλ©°, 첫 λ²μ§Έ 맀κ°λ³μλ ν¨μ λ΄μμ this
μ κ°μΌλ‘ μ¬μ©λ©λλ€. κ·Έλ¬λ .call
μ μΌνλ‘ κ΅¬λΆλ μΈμλ₯Ό λ λ²μ§Έ μΈμλ‘ μ·¨νκ³ .apply
λ μΈμμ λ°°μ΄μ λ λ²μ§Έ μΈμλ‘ μ·¨ν©λλ€. call
μ C
: Comma
λ‘ κ΅¬λΆλλ©°, apply
λ μΈμ λ°°μ΄μΈ A
: arguments
λΌκ³ κΈ°μ΅νλ©΄ μ½μ΅λλ€.
function add(a, b) {
return a + b
}
console.log(add.call(null, 1, 2)) // 3
console.log(add.apply(null, [1, 2])) // 3
λλΆμ λ©΄μ μ€λΉ μ΄μ¬ν νμ΅λλ€ κ°μ¬ν©λλ€~