λͺ¨λ μλ°μ€ν¬λ¦½νΈλ₯Ό μκ°ν©λλ€. λͺ¨λ μλ°μ€ν¬λ¦½νΈλ μ μ°¨ νλμ μ΄κ³ μ€μ©μ μΌλ‘ λ³ννκ³ μλ ECMAScript μ μ μνλ λ°©λ²μ μλ €μ€λλ€.
νμ¬ κΈμ μ°κ³ μλ μμ μΈ 2020λ μ μλ°μ€ν¬λ¦½νΈλ μ΄λ―Έ νλΆν νμ€ λ΄μ₯ κ°μ²΄(Standard built-in objects)λ€μ κ°μ§κ³ μμ΅λλ€. λλΆμ μ°λ¦¬λ λ μ΄μ μ ν΅μ μ΄κ³ κ±°λν λΌμ΄λΈλ¬λ¦¬(lodash μ κ°μ)λ€μ μ¬μ©ν νμμ±μ΄ μ€μ΄λ€κ³ μμ΅λλ€.
μ°Έκ³ : λͺ¨λ μλ°μ€ν¬λ¦½νΈλ ES6+ νκ²½μμ μ§νλ©λλ€.
- κ°λ°μμ μ€μ μ€μ΄κΈ°
- μλμΉ μμ λμ λ°©μ§
- κ°κ²°νκ³ μ½κΈ° μ¬μ΄ μ½λ μμ±
- λ¨μν¨
- κ°λ²Όμ
- λ³Έμ§
- MDN λ¬Έμ
- TC39
- 볡μ‘ν¨
- 무거μ
- μ₯ν©ν¨ (Verbose)
- λΆνμν λΌμ΄λΈλ¬λ¦¬ μ¬μ©
λͺ¨λ μλ°μ€ν¬λ¦½νΈλ μλ κ°λ λ€μ λ³Έμ§μ μ΅λ νλ λ¬Έμ₯ μ΄λ΄λ‘ κ°λ¨ λͺ λ£νκ² μ€λͺ ν©λλ€. λ³Έμ§μ κΏ°λ«μΌλ©΄ κΈΈκ² μ€λͺ ν νμλ μμ΅λλ€.
Array.prototype.reduce
Array.prototype.filter
Array.prototype.includes
Array.prototype.every
Array.prototype.some
String.prototype.split
String.prototype.join
Object.entries
Object.values
Object.keys
Rest Parameters λ μ ν΄μ§μ§ μμ μ λ§€κ°λ³μλ₯Ό μ€μ λ°°μ΄λ‘ λνλΌ μ μκ² ν©λλ€.
π μλ리μ€: κ°μκ° μ ν΄μ§μ§ μμ λ§€κ°λ³μλ₯Ό μ λ ₯ λ°μ μ΄μ μ΄ ν©μ ꡬνλ ν¨μλ₯Ό μμ±νμΈμ.
function sum (a, b, ... y, z) {
return a + b + ... + y + z
} // [a-z] κΉμ§ μ
λ ₯λ°μ μ μμ΅λλ€. μ¦ λ§€κ°λ³μμ κ°μκ° μ ν΄μ Έ μμ΅λλ€. π
console.log(sum(1, 2, 3, 4, 5, 6, 7, 8)) // [i-z] κΉμ§ undefined, λλ¬Έμ NaN μΆλ ₯ π
function sum (...params) {
return params.reduce((prev, curr) => prev + curr)
} // λ§€κ°λ³μκ° λͺ κ°λ ν©μ μ ꡬν©λλ€.
console.log(sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) // -> 55 π
π μλ리μ€: 첫λ²μ§Έ λ§€κ°λ³μμ λλ¨Έμ§ λ§€κ°λ³μλ₯Ό κ³±ν λ°°μ΄μ λ°ννλ ν¨μλ₯Ό μμ±νμΈμ.
function multiply (multiplier, ...params) {
return params.map(param => multiplier * param)
}
console.log(multiply(5, 1, 2, 3, 4)) // -> [ 5, 10, 15, 20 ] π
arguments
λ μ μ¬ λ°°μ΄μ
λλ€. λλ¬Έμ map, reduce, forEach
μ κ°μ λ°°μ΄ λ©μλλ₯Ό νΈμΆ ν μ μμ΅λλ€.
function sum (a, b, c) {
// -> TypeError: arguments.reduce is not a function
return arguments.reduce((prev, curr) => prev + curr)
}
sum(1, 2, 3)
λ°°μ΄μ΄λ κ°μ²΄μ μμ±μ ν΄μ²΄νμ¬ κ·Έ κ°μ κ°λ³ λ³μμ λ΄μ΅λλ€.
κ°μ²΄λ₯Ό ꡬ쑰 λΆν΄ν΄λ΄ μλ€.
π μλ리μ€: me
κ°μ²΄λ₯Ό μΆλ ₯νμΈμ.
π 쑰건: me.car
κ° μ‘΄μ¬νμ§ μμΌλ©΄ μμ
μ μΆλ ₯νμΈμ.
const me = {
firstName: 'λΉκ·Ό',
lastName: 'μ',
hobby: ['π³', 'π', 'π', 'πΌ'],
location: 'μ§κ΅¬',
car: 'ν
μ¬λΌ'
}
// μ½... λ΄ λ...!
console.log('μ΄λ¦', me.lastName, me.firstName)
console.log('μ§μ', me.location)
console.log('μ·¨λ―Έ', me.hobby)
// λ μ¬ννκ² μλ κΉμ?
if (me.car) {
console.log('μλμ°¨', me.car)
} else {
console.log('μλμ°¨', 'μμ')
}
const me = {
firstName: 'λΉκ·Ό',
lastName: 'μ',
hobby: ['π³', 'π', 'π', 'πΌ'],
location: 'μ§κ΅¬',
car: 'ν
μ¬λΌ'
}
const { firstName, lastName, hobby, location, car = 'μμ' } = me // μ’μ΅λλ€. π
console.log('μ΄λ¦', lastName, firstName)
console.log('μ§μ', location)
console.log('μ·¨λ―Έ', hobby)
console.log('μλμ°¨', car)
λ°°μ΄μ ꡬ쑰 λΆν΄ν΄λ΄ μλ€.
π μλ리μ€: arr1
κ³Ό λκ°μ arr2
λ₯Ό λ§λμΈμ.
π 쑰건: arr1
μ λ³νμ΄ arr2
μ μν₯μ λ―ΈμΉμ§ μκ² νμΈμ.
const arr1 = [1, 2, 3]
const arr2 = arr1 // arr2 λ arr1 λ₯Ό μ°Έμ‘°ν©λλ€.
arr1.push(4)
console.log(arr1) // -> [ 1, 2, 3, 4 ]
console.log(arr2) // -> [ 1, 2, 3, 4 ] arr2 κΉμ§ λ³νλμ΅λλ€. π
const arr1 = [1, 2, 3]
const arr2 = [...arr1] // arr1 λ₯Ό ꡬ쑰 λΆν΄μμΌ 'μλ‘μ΄' λ°°μ΄μ λ§λλλ€. π
arr1.push(4)
console.log(arr1) // -> [ 1, 2, 3, 4 ]
console.log(arr2) // -> [ 1, 2, 3 ] π
π μλ리μ€: μ£Όμ΄μ§ fruits
λ°°μ΄μ μ΄μ©ν΄ 첫λ²μ§Έ κ³ΌμΌκ³Ό λλ¨Έμ§ κ³ΌμΌμ μΆλ ₯νμΈμ.
const fruits = ['π', 'π', 'π₯']
// apple κ³Ό rest λ fruits λ₯Ό μ°Έμ‘°ν©λλ€.
const apple = fruits.shift() // fruits μ 첫λ²μ§Έ μμλ₯Ό μ κ±°νκ³ , apple μ ν λΉ
const rest = fruits
console.log('첫λ²μ§Έ κ³ΌμΌ', apple) // -> π
console.log('λλ¨Έμ§ κ³ΌμΌ', ...rest) // -> π π₯
console.log(fruits) // -> [ 'π', 'π₯'] fruits λ°°μ΄μ΄ λ³νλ¨ π
const fruits = ['π', 'π', 'π₯']
const [apple, ...rest] = fruits // λ°°μ΄μ ꡬ쑰 λΆν΄μμΌ apple κ³Ό rest κ° fruits λ₯Ό μ°Έμ‘°νμ§ μλλ‘ ν΄μ€λλ€.
console.log('첫λ²μ§Έ κ³ΌμΌ', apple) // -> π
console.log('λλ¨Έμ§ κ³ΌμΌ', ...rest) // -> π π₯
console.log(fruits) // -> [ 'π', 'π', 'π₯' ] fruits λ°°μ΄ λ³ν μλ¨ π
Default Parameter λ λ§€κ°λ³μμ κΈ°λ³Έ κ°μ ν λΉν©λλ€.
π μλ리μ€: μ΄λ¦ κ·Έλ¦¬κ³ λμ΄λ₯Ό μΆλ ₯νλ ν¨μ aboutMe
λ₯Ό μμ±νμΈμ.
π 쑰건 1: λμ΄λ₯Ό λ§€κ°λ³μλ‘ λκ²¨μ£Όμ§ μμλ€λ©΄ λΉκ³΅κ°
λ‘ μΆλ ₯νμΈμ.
π 쑰건 2: 0 μ΄
λ μ
λ ₯ κ°λ₯νλλ‘ λ§λμΈμ.
function aboutMe (name, age) {
// μ½... λ΄ λ...! π
// λ μ¬ννκ² μ λ κΉμ?
age = (typeof age !== 'undefined') ? age : 'λΉκ³΅κ°'
console.log(name, age)
}
aboutMe('μλΉκ·Ό') // -> μλΉκ·Ό λΉκ³΅κ°
aboutMe('μλΉκ·Ό', 0) // -> μλΉκ·Ό 0
aboutMe('μλΉκ·Ό', 20) // -> μλΉκ·Ό 20
function aboutMe (name, age) {
if (!age) { // 0 μ 'κ±°μ§ κ°' μ΄κΈ° λλ¬Έμ 0 μ΄μ μ
λ ₯ν΄λ 'λΉκ³΅κ°'λ₯Ό μΆλ ₯ν©λλ€. π
age = 'λΉκ³΅κ°'
}
console.log(name, age)
}
aboutMe('μλΉκ·Ό') // -> μλΉκ·Ό λΉκ³΅κ°
aboutMe('μλΉκ·Ό', 0) // -> μλΉκ·Ό λΉκ³΅κ° ... 0 μ΄μ μ
λ ₯νμ§λ§ 'λΉκ³΅κ°'κ° μΆλ ₯λλ€μ? π
aboutMe('μλΉκ·Ό', 20) // -> μλΉκ·Ό 20
function aboutMe (name, age = 'λΉκ³΅κ°') { // λͺ¨λ 쑰건μ λ§μ‘±νλ©° μ¬νν©λλ€. π
console.log(name, age)
}
aboutMe('μλΉκ·Ό') // -> μλΉκ·Ό λΉκ³΅κ°
aboutMe('μλΉκ·Ό', 0) // -> μλΉκ·Ό 0
aboutMe('μλΉκ·Ό', 20) // -> μλΉκ·Ό 20
μ΄λ¦μ μ λ ₯νμ§ μκ³ λμ΄λ§ μ λ ₯νκ³ μΆλ€λ©΄ μ΄λ»κ² ν΄μΌν κΉμ? 그건 λΆκ°λ₯ν©λλ€.
μλλ©΄ aboutMe
μ λ§€κ°λ³μλ μμκ° μ ν΄μ§ λ§€κ°λ³μμ΄κΈ° λλ¬Έμ΄μ£ .
aboutMe(, 10) // μ΄λ°κ±΄ λΆκ°λ₯ν©λλ€.
aboutMe(10) // κ·Έλ λ€κ³ μ΄λ κ² νμλ name λ§€κ°λ³μμ μ«μ 10 μ΄ λ€μ΄κ°λ²λ¦½λλ€.
Destructuring Assignment λ₯Ό νμ©νλ©΄ μλ°μ€ν¬λ¦½νΈμμλ Named Parameter λ₯Ό μ¬μ©ν μ μμ΅λλ€. μ¦ λ§€κ°λ³μμ μμκ° μμ΄μ§κ³ μ΄λ¦μ΄ λΆκ² λλ κ±°μ£ .
μ΄ κ°λ μ λ€μ λ¨μμμ λ€λ£Ήλλ€. κ·Έλ¬λ λ§λ³΄κΈ° μ½λλ§ νκ³ λμ΄κ° λ³΄μ£ .
function aboutMe ({ name = 'λΉκ³΅κ°', age = 'λΉκ³΅κ°' }) { // 'μμ' κ° μ¬λΌμ§ λ§€κ°λ³μλ€ πππ
console.log(name, age)
}
aboutMe({ name: 'μλΉκ·Ό', age: 20 }) // -> μλΉκ·Ό 20
aboutMe({ age: 20, name: 'μλΉκ·Ό' }) // -> μλΉκ·Ό 20 ... μ¬μ§μ΄ λ§€κ°λ³μ μμκΉμ§ λ°κ»΄λ μ μΆλ ₯ν©λλ€!
aboutMe({ name: 'μλΉκ·Ό' }) // -> μλΉκ·Ό λΉκ³΅κ° ... λμ΄λ₯Ό λκΈ°μ§ μμμΌλ―λ‘ 'λΉκ³΅κ°' λ₯Ό μΆλ ₯ν©λλ€.
aboutMe({ age: 20 }) // -> λΉκ³΅κ° λΉκ³΅κ°
aboutMe({}) // -> λΉκ³΅κ° λΉκ³΅κ° ... λ λ€ 'λΉκ³΅κ°' λ‘ μΆλ ₯ κ°λ₯ν©λλ€!
Named Parameter λ λ§€κ°λ³μμ μ΄λ¦μ μ§μ ν΄μ€λλ€.
π μλ리μ€: λμ΄μ μ§μ
μ λ§€κ°λ³μλ‘ λ°κ³ μΆλ ₯νλ ν¨μ aboutMe
λ₯Ό μμ±νμΈμ.
π 쑰건 1: λμ΄λ§ μ λ ₯ν μλ, μ§μ λ§ μ λ ₯ν μλ, λ λ€ μ λ ₯ν μλ κ·Έλ¦¬κ³ λ λ€ μ λ ₯ μ ν μλ μκ² ν¨μλ₯Ό μμ±νμΈμ.
// λ§€κ°λ³μμ μμκ° μ ν΄μ ΈμκΈ° λλ¬Έμ 쑰건μ λ§μ‘±νμ§ λͺ»ν©λλ€. π
function aboutMe (age, job) {
age && console.log('λμ΄', age)
job && console.log('μ§μ
', job)
}
aboutMe(20) // -> λμ΄ 20 ... λμμ§ μμ 보μ
λλ€. νμ§λ§ λ€μ λΌμΈμ λ΄λ³΄μΈμ.
// ν¨μκ° κΈ°λν κ²μ²λΌ μλνμ§ μμ΅λλ€!
aboutMe('κ°λ°μ') // -> λμ΄ κ°λ°μ ... λμ΄κ° κ°λ°μλΌκ³ λμκ΅°μ. π
// Named Parameter λλΆμ 쑰건μ λ§μ‘±ν©λλ€.
// μ νμ μΌλ‘ λ§€κ°λ³μλ₯Ό μ
λ ₯ν μ μμ΅λλ€. π
function aboutMe ({ age, job }) {
age && console.log('λμ΄', age)
job && console.log('μ§μ
', job)
}
// λμ΄μ μ§μ
μ€ νλλ§ μ
λ ₯λ κ°λ₯ν©λλ€. π
aboutMe({ age: 20 }) // -> λμ΄ 20
aboutMe({ job: 'κ°λ°μ' }) // -> μ§μ
κ°λ°μ
λ§€κ°λ³μκ° 3κ° μ΄μμ΄λ©΄ μμλ₯Ό μλͺ» μ λ ₯ν κ°λ₯μ±μ΄ ν½λλ€.
νΉν λ§€κ°λ³μμ νμ μ μ§μ ν μ μκΈ°λλ¬Έμ μλ¬΄λ° κ²½κ³ μμ΄ ν¨μκ° μ€νλκ³ , μμμΉ λͺ»ν μΌμ΄ λ°μνκ² μ£ .
μ΄λ₯Ό λ°©μ§νλ €λ©΄ μμ μλ λ§€κ°λ³μλ₯Ό μ¬μ©ν΄μΌν©λλ€.
π μλ리μ€: μ°½ μ΄λ¦, κ°λ‘, μΈλ‘ μ¬μ΄μ¦, λ°°κ²½μ, ν λ리 μ, ν λ리 λκ» κ·Έλ¦¬κ³ ν°νΈλ₯Ό μ λ ₯ λ°μ μλ‘μ΄ μ°½μ λ λλ§νλ ν¨μλ₯Ό μμ±νμΈμ.
function render (name, width, height, backgroundColor, borderColor, borderWidth, font) {
// doSomething ...
}
// λ§€κ°λ³μ μμλ₯Ό νλλΌλ ν리면 ν° μΌλ©λλ€.
render('μ μ°½', 640, 480, 'red', 'green', 1, 'Apple Bold')
function render ({ name, width, height, backgroundColor, borderColor, borderWidth, font }) {
// doSomething ...
}
// μ΄μ λ§€κ°λ³μ μμμ μκ΄μμ΄ μμ νκ² νΈμΆ κ°λ₯ν©λλ€. π
render({
height: 480,
borderColor: 'green',
backgroundColor: 'red',
font: 'Apple Bold',
name: 'μ μ°½',
borderWidth: 1,
width: 640
})
μ°Έκ³Ό κ±°μ§μ Boolean μ κΈ°λνλ λ¬Έλ§₯μμ true
false
λ‘ νκ°λλ κ°μ
λλ€.
μλ°μ€ν¬λ¦½νΈμλ μ΄ 7 κ°μ§ κ±°μ§ κ°μ΄ μ‘΄μ¬ν©λλ€.
false
0
0n
''
null
undefined
NaN
λ°°μ΄μ length
νλ‘νΌν°λ₯Ό κ°μ§κ³ μμ΅λλ€. μ΄λ₯Ό κ²μ¬ν΄ λ°°μ΄μ΄ λΉμ΄μλμ§ νμΈ κ°λ₯ν©λλ€.
const arr = [1, 2, 3]
if (arr.length === 0) { // μ’ λ μ¬ννκ² μλ κΉμ?
console.log('λ°°μ΄μ΄ λΉμ΄μμ!')
}
const arr = [1, 2, 3]
if (!arr.length) { // π μ’μ΅λλ€! 0 μ Falsy κΈ° λλ¬Έμ λ°°μ΄μ΄ λΉμ΄μλ€λ©΄ 쑰건μ λ§μ‘±ν©λλ€.
console.log('λ°°μ΄μ΄ λΉμ΄μμ!')
}
μ‘΄μ¬νμ§ μλ ν¨μλ₯Ό νΈμΆνλ©΄ TypeError: ... is not a function
λ₯Ό throw
ν©λλ€.
μ΄λ₯Ό λ°©μ§νκ³ μ λ°©μ΄μ μΈ μ½λλ₯Ό μμ±ν΄λ΄ μλ€.
const notArray = 5000
notArray.forEach(it => console.log(it)) // -> TypeError: notArray.forEach is not a function
const iAmNotArray = 5000
if (iAmNotArray.forEach) {
iAmNotArray.forEach(it => console.log(it)) // π
}
μμμ μΈκΈν κ±°μ§ κ°μ μ μΈνλ©΄ λͺ¨λ μ°Έ κ°μ λλ€.
movie
κ°μ²΄λ₯Ό μ°Έμ‘°ν΄ <μμ΄μΈλ§¨> μ΄ νκΈ μλ§μ μ§μνλμ§ νμΈν΄ λ΄
μλ€.
const movie = {
ironman: {
ko: 'μμ΄μΈλ§¨ 4',
en: 'Iron Man 4'
}
}
// μ’μ΅λλ€. π
if (movie.ironman.ko) {
console.log('νκΈ μλ§ κ°λ΄')
}
map
μ μ£Όμ΄μ§ λ°°μ΄μ λͺ¨λ μμμ κ·μΉμ μ μ©ν μλ‘μ΄ λ°°μ΄μ μμ±ν©λλ€.
map
μ μ£Όμ΄μ§ λ°°μ΄μ λ³ννμ§ μμ΅λλ€.
map
μ 첫 callback
ν¨μκ° μ€νλκΈ° μ§μ μ μ£Όμ΄μ§ λ°°μ΄μ 볡μ¬λ³Έμ μμ±ν©λλ€. λλ¬Έμ callback
ν¨μλ₯Ό μ€ννλ λμμ μ£Όμ΄μ§ λ°°μ΄μ΄ λ³νλμ΄λ κ²°κ³Όμ μν₯μ λ―ΈμΉμ§ μμ΅λλ€.
map
μ μ£Όμ΄μ§ λ°°μ΄μ λͺ¨λ μμμ callback
ν¨μλ₯Ό μννλ κ²μ΄ λͺ©νμ
λλ€. λ°λΌμ μ€κ°μ break or continue
νΈμΆμ λΆκ°ν©λλ€.
λ€μ λ§ν΄ map
μ λ°λ³΅λ¬Έμ΄ μλλλ€.
map
μ νμΆνλ λ°©λ²μ μλ¬λ₯Ό throw
νλ κ²λλ€. νμ§λ§ μ΄ λ°©λ²μ λλλ‘ μ¬μ©νμ§ λ§μΈμ. for
λ¬Έμ κ³ λ €νλ κ² λ λμμ§λ λͺ¨λ¦
λλ€.
π μλ리μ€: λ°°μ΄ numbers
μ λͺ¨λ μμμ 2 λ₯Ό κ³±ν μλ‘μ΄ λ°°μ΄ result
λ₯Ό λ§λμΈμ.
const numbers = [1, 2, 3, 4, 5]
const result = []
// μ₯ν©ν©λλ€. π
for (let i = 0; i < numbers.length; i++) {
result.push(numbers[i] * 2)
}
console.log(result) // -> [ 2, 4, 6, 8, 10 ]
const numbers = [1, 2, 3, 4, 5]
const result = numbers.map(number => { return number * 2 })
console.log(result) // -> [ 2, 4, 6, 8, 10 ]
π μλ리μ€: λ°°μ΄ cities
μ λͺ¨λ μμμ κ΄μμ
λ¬Έμμ΄μ λ€μ λΆμΈ μλ‘μ΄ λ°°μ΄ metropolitanCities
μ λ§λμΈμ.
const cities = ['λΆμ°', 'λꡬ', 'μΈμ²', 'κ΄μ£Ό']
const metropolitanCities = []
// μ₯ν©ν©λλ€. π
for (let i = 0; i < cities.length; i++) {
metropolitanCities.push(cities[i] + 'κ΄μμ')
}
console.log(metropolitanCities) // -> [ 'λΆμ°κ΄μμ', 'λꡬκ΄μμ', 'μΈμ²κ΄μμ', 'κ΄μ£Όκ΄μμ' ]
const cities = ['λΆμ°', 'λꡬ', 'μΈμ²', 'κ΄μ£Ό']
const metropolitanCities = cities.map(city => { return `${city}κ΄μμ` }) // π
console.log(metropolitanCities) // -> [ 'λΆμ°κ΄μμ', 'λꡬκ΄μμ', 'μΈμ²κ΄μμ', 'κ΄μ£Όκ΄μμ' ]
const cities = ['λΆμ°', 'λꡬ', 'μΈμ²', 'κ΄μ£Ό']
const metropolitanCities = cities.map(city => `${city}κ΄μμ`) // π
console.log(metropolitanCities) // -> [ 'λΆμ°κ΄μμ', 'λꡬκ΄μμ', 'μΈμ²κ΄μμ', 'κ΄μ£Όκ΄μμ' ]