`문자열`, `문자열 ${표현식} 문자열`, tag`문자열 ${표현식} 문자열`
Template Literal은 문자열 처리를 위한 리터럴로써 표현식을 포함할 수 있습니다.
기존에 우리가 문자열 사이에 동적으로 변경될 변수값을 넣어야 한다고 하면 '오늘의 날짜는' + today + 입니다. 이처럼 + 연산자로 문자열 결합을 해야했습니다.
하지만, Template Literal을 통해 표현식이 포함된 문자열처리를 한 번에 할 수 있게 됩니다.
또한, 함수를 호출하며 Template Literal을 바로 파라미터로 넣어줄 수도 있는데 템플릿 안의 표현식이 있다면 평가가 된 결과가 파라미터로 넘어가게 됩니다.
console.log(`ABC`); const one = 1, two = 2; const result = `1 + 2는 ${one + two}이 된다.`; console.log(result); console.log(`1 + 2는\n ${one + two}이 된다.`); // ABC // 1 + 2는 3이 된다. // 1 + 2는 // 3이 된다.
템플릿에 함수 이름을 작성한 형태를 tagged Template라 하는데 여기서 호출되는 함수를 태그함수(tag function)라 부릅니다.
const one = 1, two = 2; const show = (text, value) => { console.log(`${text[0]}${value}`); console.log(text[1]); }; show `1 + 2 = ${one + two}`; // 1 + 2 = 3 // ""
const one = 1, two = 2; const show = (text, plus, minus) => { console.log(`${text[0]}${plus}`); console.log(`${text[1]}${minus}`); console.log(`${text[2]}${text[3]}`); }; show `1 + 2는 ${one + two}이고 1 - 2는 ${one-two}입니다.`; // 1 + 2는 3 // 이고 1 - 2는 -1 // 입니다.undefined
⇒ 간단한 템플릿이 아닌 조금 더 복잡한 템플릿일 경우에는 태그 함수에 대응하는 파라미터 이름을 작성해야 합니다.
const one = 1, two = 2; const show = (text, ...rest) => { console.log(`${text[0]}${rest[0]}`); console.log(`${text[1]}${rest[1]}${text[2]}`); }; show `1 + 2는 ${one + two}이고 1 - 2는 ${one-two}입니다.`; // 1 + 2는 3 // 이고 1 - 2는 -1입니다.
⇒ 템플릿의 표현식을 좀 더 유연하게 받을 수 있습니다.
많은 템플릿들을 사용할 때 줄바꿈(\n)이나 유니코드(\u{31}\u{32})등을 사용할 때 평가결과로 출력 되기 때문에 문제가 생길 수 있습니다.
예를 들어 <span>\n문자열 가이드</span>
이라는 태그가 있다고 할 때 실제 노출되는 결과는 아래와 같습니다. 그렇기에 이런 줄바꿈 혹은 유니코드들을 단순 문자열로 취급하려 할 때 사용하는게 String.raw 입니다.
console.log(`\u{31}\u{32}`); console.log(String.raw `\u{31}\u{32}`); // 12 // \u{31}\u{32}
String.raw()는 배열의 요소별, 혹은 문자열의 문자 하나씩을 각각 전개하며 조합하여 연결하는 함수입니다.
const one = 1, two = 2; console.log(String.raw({raw:"ABCD"}, one , two, 3, 5)); // A1B2C3D
배열
const rawValue = {raw : ["A", "B", "C"]}; console.log(String.raw(rawValue, 1,2,3)); // A1B2C
⇒ `A ${1} B ${2} C`
C뒤에는 표현식이 없는것으로 처리해 3이 첨부되지 않습니다