[JS] ๐ ES6 ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด ์ฌ์ฉ๋ฒ ์ ๋ฆฌ
Template literals
ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฌธ์์ด์ ์ ๋ ฅํ๋ ์ ์ง์ ์ธ ๋ฐฉ์์ ๋๋ค.
ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ํํ์/๋ฌธ์์ด ์ฝ์ , ์ฌ๋ฌ ์ค ๋ฌธ์์ด, ๋ฌธ์์ด ํ์ํ, ๋ฌธ์์ด ํ๊น ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด ๊ธฐ๋ณธ ๋ฌธ๋ฒ
`string text` // ๋ฌธ์์ด ํํ
`string text line 1
string text line 2` // ๊ฐํ๋ ๋ฌธ์์ด ํํ
var expression;
`string text ${expression} string text` // ๋ณ์๊ฐ ๋ฌธ์์ด ์กฐํฉ
function tag() { };
tag `string text ${expression} string text` // ํจ์ ํธ์ถ ์๊ท๋จผํธ
ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ์์๋ฐ์ดํ(')๋ ํฐ๋ฐ์ดํ(") ๋์ ๋ฐฑํฑ(`)(grave accent)๋ก ๊ฐ์ธ์ค๋๋ค.
Expression interpolation (ํํ์ ์ฝ์ ๋ฒ)
ES6 ์ด์ ์ ํํ์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ๋ฐ ๋ฌธ์์ด ์์ ์ง์ด๋ฃ์์ต๋๋ค.
var a = 20;
var b = 8;
var c = "์๋ฐ์คํฌ๋ฆฝํธ";
var str = "์ ๋ " + (a + b) + "์ด์ด๊ณ " + c + "๋ฅผ ์ข์ํฉ๋๋ค.";
console.log(str); //์ ๋ 28์ด์ด๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ข์ํฉ๋๋ค.
ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์์๋ ์๋์ ๊ฐ์ด $์ ์ค๊ดํธ{}๋ฅผ ์ฌ์ฉํ์ฌ ํํ์์ ํ๊ธฐํ ์ ์์ต๋๋ค.
let a = 20;
let b = 8;
let c = "์๋ฐ์คํฌ๋ฆฝํธ";
let str = `์ ๋ ${a+b}์ด์ด๊ณ ${c}๋ฅผ ์ข์ํฉ๋๋ค.`;
console.log(str); //์ ๋ 28์ด์ด๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ข์ํฉ๋๋ค.
์ ์ฒ๋ผ + ์ฐ์ฐ์๋ก ๋ฌธ์์ด์ ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ๋ณด๋ค ๊ฐ๋ ์ฑ์ด ๋ ์ข์ต๋๋ค.
Tagged templates
ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ๋ฐ์ ๋ ํํ์ ํ๋๋ก ํ๊ทธ๋ ํ ํ๋ฆฟ์ด ์์ต๋๋ค.
ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ํจ์๋ก ํ์ฑํ ์ ์์ต๋๋ค.
let person = 'Lee';
let age = 28;
let tag = function(strings, personExp, ageExp) {
console.log(strings); // ์ฒซ ์ธ์๋ ๋ฐฐ์ด์ด ๋ค์ด์ค๊ณ
console.log(personExp); // ๋๋จธ์ง ์ธ์๋ ${person}๊ฐ์ด ๋ค์ด์จ๋ค.
console.log(ageExp); // ๋๋จธ์ง ์ธ์๋ ${age}๊ฐ์ด ๋ค์ด์จ๋ค.
};
let output = tag`that ${person} is a ${age}`;
let myTag = function(strings, a, b, c) {
console.log(`๋ฌธ์์ด ๋ฐฐ์ด ๊ธธ์ด : ${strings.length}`);
for(let i = 0; i < strings.length; i+=1) {
console.log(`๋ฌธ์์ด ์์ [${i}]: ${strings[i]}`);
}
console.log(a);
console.log(b);
console.log(c);
}
let html = 5;
let css = 3;
let js = 'es10';
let string = myTag`HTML${html}, CSS${css}, JavaScript ${js}`;
Tagged templates๋ ๋ฐ์ดํฐ ๋ณ๋ก ์ํฉ(์กฐ๊ฑด)์ด ๋ค๋ฅธ ๊ฒฝ์ฐ ์ ์ฉํ๊ฒ ์ฐ์ผ ์ ์์ต๋๋ค.
const ramenList = [
{
brand: '๋์ฌ',
items: ['์ ๋ผ๋ฉด','์งํ๊ฒํฐ','์ฐธ์น๋ง์','๋ฅ์ง๋๋ฉด']
},
{
brand: '์ผ์',
items: ['์ผ์๋ผ๋ฉด', '๋ถ๋ญ๋ณถ์๋ฉด']
},
{
brand: '์ค๋๊ธฐ',
itmes: []
}
];
console.log(`๊ตฌ๋งค๊ฐ๋ฅํ ${ramenList[0].brand}์ ๋ผ๋ฉด : ${ramenList[0].items}`);
//๊ตฌ๋งค๊ฐ๋ฅํ ๋์ฌ์ ๋ผ๋ฉด : ์ ๋ผ๋ฉด,์งํ๊ฒํฐ,์ฐธ์น๋ง์,๋ฅ์ง๋๋ฉด
console.log(`๊ตฌ๋งค๊ฐ๋ฅํ ${ramenList[1].brand}์ ๋ผ๋ฉด : ${ramenList[1].items}`);
//๊ตฌ๋งค๊ฐ๋ฅํ ์ผ์์ ๋ผ๋ฉด : ์ผ์๋ผ๋ฉด,๋ถ๋ญ๋ณถ์๋ฉด
console.log(`๊ตฌ๋งค๊ฐ๋ฅํ ${ramenList[2].brand}์ ๋ผ๋ฉด : ${ramenList[2].items}`);
//๊ตฌ๋งค๊ฐ๋ฅํ ์ค๋๊ธฐ์ ๋ผ๋ฉด : undefined
์์ ๊ฐ์ด ramenList ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ ๊ฒฝ์ฐ, ์ค๋๊ธฐ์ ๋ผ๋ฉด ๋ฐ์ดํฐ๋ ์์ง ์ถ๊ฐ๊ฐ ์๋์ด ์๊ณ , ๊ทธ ๊ฒฐ๊ณผ undefined๋ผ๋ ๊ฒฐ๊ณผ๊ฐ ๋์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์ tagged templates๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
function fn(strings, brand, items) {
if(undefined === items) {
return brand + "์ ๋ผ๋ฉด์ ์ฌ๊ณ ๊ฐ ์์ต๋๋ค!";
} else {
return strings[0] + brand + strings[1] + items;
}
}
console.log(fn`๊ตฌ๋งค๊ฐ๋ฅํ ${ramenList[0].brand}์ ๋ผ๋ฉด : ${ramenList[0].items}`);
//๊ตฌ๋งค๊ฐ๋ฅํ ๋์ฌ์ ๋ผ๋ฉด : ์ ๋ผ๋ฉด,์งํ๊ฒํฐ,์ฐธ์น๋ง์,๋ฅ์ง๋๋ฉด
console.log(fn`๊ตฌ๋งค๊ฐ๋ฅํ ${ramenList[1].brand}์ ๋ผ๋ฉด : ${ramenList[1].items}`);
//๊ตฌ๋งค๊ฐ๋ฅํ ์ผ์์ ๋ผ๋ฉด : ์ผ์๋ผ๋ฉด,๋ถ๋ญ๋ณถ์๋ฉด
console.log(fn`๊ตฌ๋งค๊ฐ๋ฅํ ${ramenList[2].brand}์ ๋ผ๋ฉด : ${ramenList[2].items}`);
//์ค๋๊ธฐ์ ๋ผ๋ฉด์ ์ฌ๊ณ ๊ฐ ์์ต๋๋ค!
Multi-line strings
ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐํ ์ค์ ๋ฌธ์์ด๋ ๋๋ ์ ์์ฑํ ํ์๊ฐ ์์ด ํ๋ฒ์ ์์ฑ ๊ฐ๋ฅํฉ๋๋ค.
console.log("string text line 1\n" + "string text line 2");
//ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด
console.log(`string text line 1
string text line 2`);
Nesting templates (์ค์ฒฉ ํ ํ๋ฆฟ)
ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ๋ง๋ค ๋ค๋ฅธ ๋ฌธ์์ด์ ๋ณ์์ ์ ์ฅํ๊ณ ์ถ์ ๋, ํ ํ๋ฆฟ์ ์ค์ฒฉํด์ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ ์ฑ์ด ๋ ์ข์ ๋๊ฐ ์๋ค๊ณ ํฉ๋๋ค.
//ES5
var classes = 'header'
classes += (isLargeScreen() ?
'' : item.isCollapsed ?
' icon-expander' : ' icon-collapser');
//ES6, Not use nesting templates
const classes = `header ${ isLargeScreen() ? '' :
(item.isCollapesd ?
'icon-expander' : 'icon-collapser')}`;
//ES6, Used nesting templates
const classes = `header ${ isLargeScreen() ? '' :
`icon-${item.isCollapsed ?
'expander' : 'collapser'}` }`;
Raw strings (์๋ ๋ฌธ์์ด)
Raw string์ ์ด์ค์ผ์ดํ ๋ฌธ์๋ฅผ ํด์ํ์ง ์์ ์ผ๋ฐ ๋ฌธ์์ด์
๋๋ค.
String.raw ํ๊ทธํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ํ
ํ๋ฆฟ ๋ฌธ์์ด์ ์
๋ ฅํ ๋๋ก ์ถ๋ ฅํ ์ ์์ต๋๋ค.
let s = String.raw`xy\n${1+1}z`;
console.log(s); //xy\n2z
ํ๊ทธ ํจ์๋ฅผ ๋ง๋ค์ด ์๋์ ๋ฌธ์์ด์ ๋ฐํํ๋ ค๋ฉด ์ฒซ ๋ฒ์งธ ์ธ์์ raw ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
let tag = function(strings) {
console.log(strings);
return strings.raw[0];
}
let str = tag`Hello\nWorld.`;
console.log(str); //Hello\nWorld.