ES6이전에는 템플릿 문자열이라고 부르던 것을 ES6에서 템플릿 리터럴이라 부르게 되었다. ES6에서 문자열을 삽입하는 방식에 대해 알아보자 !!
템플릿 리터럴이란 내장된 표현식을 허용하는 문자열 리터럴로 표현식 / 문자열 삽입, 여러 줄 문자열, 문자열 형식화, 문자열 태깅 등 다양한 기능을 제공한다.
let name = 'Hojun';
let greeting = 'Hello my name is ' + name ;
console.log(greeting); // Hello my name is Hojun
let name = 'Hojun';
const greeting = 'Hello my name is ${name}';
console.log(greeting); // Hello my name is Hojun
let a = 1;
let b = 10;
console.log('1 * 10 is ' + (a * b)); // 1 * 10 is 10
let a = 1;
let b = 10;
console.log(`1 * 10 is ${a * b}`); // 1 * 10 is 10
let text = "Hello, \
my name is Alberto \
how are you? \ ";
let text = `Hello,
my name is Alberto
how are you?`;
const people = [{
name: 'HOJUN 1',
age: 27,
}, {
name: 'HOJUN 2',
age: 28,
}, {
name: 'HOJUN 3',
age: 29,
}
];
const markup = `
<ul>
${people.map(person => `<li> ${person.name} </li>`)}
</ul>
`;
console.log(markup);
// <ul>
// <li> HOJUN 1 </li>,<li> HOJUN 2 </li>, <li> HOJUN 3 </li>
// </ul>
const isDiscounted = false;
function getPrice() {
console.log(isDiscounted ? "$10" : "$20");
}
getPrice(); // $20
// name, age와 함께 artist 객체 생성
const artist = {
name: "HOJUN",
age: 27,
};
// artist 객체에 song 프로퍼티가 있을 때만 문장에 추가하고,
// 없으면 아무것도 반환하지 않는다.
const text = `
<div>
<p> ${artist.name} is ${artist.age} years old ${artist.song ?
`and wrote song ${artist.song}` : '' }
</p>
</div>
`;
// <div>
// <p> HOJUN is 27 years old
// </p>
// </div>
const artist = {
name: "HOJUN",
age: 27,
song: 'Love',
};
// <div>
// <p> HOJUN is 27 years old and wrote the song Love
// </p>
// </div>
const groceries = {
meat: "pork chop",
beggie: "salad",
fruit: "apple",
others: ['mushrooms', 'instant noodles', 'instant soup'],
};
// groceries의 각 값에 대해 map()을 수행하는 함수
function groceryList (others) {
return `
<p>
${toehrs.map( other => ` <span>${other}</span>`).join('\n')}
</p>
`;
}
// p 태그 내 모든 groceries를 출력. 마지막은 others 배열의 모든 원소를 포함한다.
const markup = `
<div>
<p>${groceries.meat}</p>
<p>${groceries.veggie}</p>
<p>${groceries.fruit}</p>
<p>${groceryList(groceries.others)}</p>
</div>
`;
// <div>
// <p>pork chop</p>
// <p>salad</p>
// <p>apple</p>
// <p>
// <p>
// <span>mushrooms</span>
// <span>instant noodles</span>
// <span>instant soup</span>
// <p>
// <p>
// </div>
함수를 태그하여 템플릿 리터럴을 실행하면 템플릿 내부에 있는 모든 항목이 태그된 함수의 인수로 제공된다.
작동 방식은 매우 간단하다. 함수 이름을 가져다 실행할 템플릿 앞에 쓰기만 하면 된다...?
let person = "HOJUN";
let age = 27;
function myTag(strings, personName, personAge) {
// strings: ["That ", " is a ", "!"]
let str = string[1]; // " is a "
let ageStr;
personAge > 50 ? ageStr = "grandpa" : ageStr = "youngster";
return personName + str + ageStr;
}
let sentence = myTag`That ${person} is a ${age}!`;
console.log(sentence); // HOJUN is a youngster
위의 예제에서 myTag 함수의 첫번째 인수 strings는 let sentence 문의 전체 문자열 중 템플릿 리터럴 변수를 제외한 문자열들이 담긴 배열로 설정되고 템플릿 리터럴 변수들이 나머지 인수가 된다.
좀 풀어서 설명하자면 strings 배열의 각 원소는 템플릿 리터럴에 포함된 변수들을 구분자로 삼아 문자열을 나눈 결과와 같다.
let str = strings[1]; // " is a "