Baseline Widely available
í í릿 리í°ë´ì ë´ì¥ë ííìì íì©íë 문ìì´ ë¦¬í°ë´ì ëë¤. ì¬ë¬ ì¤ë¡ ì´ë¤ì§ 문ìì´ê³¼ 문ì ë³´ê°ê¸°ë¥ì ì¬ì©í ì ììµëë¤. ì´ì ë²ì ì ES2015ì¬ì ëª ì¸ììë "template strings" (í í릿 문ìì´) ë¼ê³ ë¶ë ¤ ììµëë¤.
Syntax`string text` `string text line 1 string text line 2` `string text ${expression} string text` tag `string text ${expression} string text`Description
í
í릿 리í°ë´ì ì´ì¤ ë°ì´í ë ìì ë°ì´í ëì ë°±í±(` `) (grave accent) ì ì´ì©í©ëë¤. í
í릿 리í°ë´ì ëí íë ì´ì¤ íë를 ì´ì©íì¬ ííìì ë£ì ì ìëë°, ì´ë $ì ì¤ê´í¸( $ {expression}
) ë¡ í기í ì ììµëë¤. íë ì´ì¤ íë ìììì ííìê³¼ ê·¸ ì¬ì´ì í
ì¤í¸ë í¨ê» í¨ìë¡ ì ë¬ë©ëë¤. 기본 í¨ìë ë¨ìí í´ë¹ ë¶ë¶ì ë¨ì¼ 문ìì´ë¡ ì°ê²°ìì¼ ì¤ëë¤. í
í릿 리í°ë´ ìì ì´ë í ííìì´ ìë¤ë©´(ì¬ê¸°ììë íê·¸), í
í릿 리í°ë´ì "íê·¸ê° ì§ì ë í
í릿"ì´ë¼ê³ ë¶ë¦¬ê² ë©ëë¤. ì´ ë, íê·¸ ííì (ì£¼ë¡ í¨ì)ì´ ì²ë¦¬ë í
í릿 리í°ë´ê³¼ í¨ê» í¸ì¶ëë©´, ì¶ë ¥í기 ì ì ì¡°ìí ì ììµëë¤. í
í릿 리í°ë´ ììì ë°±í± ë¬¸ì를 ì¬ì©íë ¤ë©´ ë°±í± ìì ë°±ì¬ë¬ì¬(\)를 ë£ì¼ììì¤.
`\`` === "`"; // --> true
Multi-line strings
source ë´ì ì½ì ëë newline characters(\n)ì template literalì ì¼ë¶ê° ë©ëë¤.
ì¼ë° string ë¤ì ì¬ì©íì¬, multi-line strings ë¤ì ì»ê¸° ìí´ìë ìëì ê°ì 문ë²ì ì¬ì©í´ì¼ í ê²ì ëë¤.
console.log("string text line 1\n" + "string text line 2");
// "string text line 1
// string text line 2"
ê°ì í¨ê³¼ë¥¼ template literalì íµí´ ì»ê¸° ìí´ìë, ìëì ê°ì´ ì ì ì ììµëë¤.
console.log(`string text line 1
string text line 2`);
// "string text line 1
// string text line 2"
Expression interpolation(ííì ì½ì
ë²)
ííì(expression)ì ì¼ë° 문ìì´(normal strings)ì ì½ì í기 ìí´ì, ë¹ì ì ë¤ìì 문ë²ì ì¬ì©í ì ìì ê²ì ëë¤.
var a = 5;
var b = 10;
console.log("Fifteen is " + (a + b) + " and\nnot " + (2 * a + b) + ".");
// "Fifteen is 15 and
// not 20."
template literalsì ì´ì©íë©´, ì´ë¥¼ ëì± ì½ê¸° ì½ëë¡ ë¤ìê³¼ ê°ì ë¬¸ë² ì¤í(syntactic sugar) ì íì©í ì ììµëë¤.
var a = 5;
var b = 10;
console.log(`Fifteen is ${a + b} and
not ${2 * a + b}.`);
// "Fifteen is 15 and
// not 20."
Nesting templates
í¹ì í ê²½ì° í
í릿ì ì¤ì²©íë ê²ì´ êµ¬ì± ê°ë¥í 문ìì´ì ì½ë ì½ê¸° ê°ì¥ ì¬ì´ ë°©ë²ì
ëë¤. ë°± ì¤íì´ì¤ í
í릿 ë´ìì í
í릿 ë´ì ì리 íìì${}
ì ë´ë¶ ë°±í±ì ì¬ì©íë ê²ì´ ì½ìµëë¤. ì를 ë¤ì´, ì¡°ê±´ aê° ì°¸ì´ë©´:ì´ í
í릿ì 문ì ê·¸ëë¡ ë°íí©ëë¤.
In ES5:
var classes = "header";
classes += isLargeScreen()
? ""
: item.isCollapsed
? " icon-expander"
: " icon-collapser";
ES2015ìì ì¤ì²©(nesting)ìì´ í í릿 리í°ë´ ì¬ì©í ê²½ì°:
const classes = `header ${
isLargeScreen() ? "" : item.isCollapsed ? "icon-expander" : "icon-collapser"
}`;
ES2015ìì ì¤ì²©ë(nested) í í릿 리í°ë´ì ì¬ì©í ê²½ì°:
const classes = `header ${
isLargeScreen() ? "" : `icon-${item.isCollapsed ? "expander" : "collapser"}`
}`;
Tagged templates
template literals ì ëì± ë°ì ë í ííë tagged templates ì ëë¤. í그를 ì¬ì©íë©´ í í릿 리í°ë´ì í¨ìë¡ íì± í ì ììµëë¤. íê·¸ í¨ìì 첫 ë²ì§¸ ì¸ìë 문ìì´ ê°ì ë°°ì´ì í¬í¨í©ëë¤. ëë¨¸ì§ ì¸ìë ííìê³¼ ê´ë ¨ë©ëë¤. ê²°êµ í¨ìë ì¡°ì ë 문ìì´ì ë°í í ì ììµëë¤ (ëë ë¤ì ìì ìì ì¤ëª íë ê²ê³¼ ìì í ë¤ë¥¸ 결과를 ë°í í ì ììµëë¤). function ì´ë¦ì ìíë ì´ë¤ ê²ì´ë ê°ë¥í©ëë¤.
var person = "Mike";
var age = 28;
function myTag(strings, personExp, ageExp) {
var str0 = strings[0]; // "that "
var str1 = strings[1]; // " is a "
// ì¬ì¤ ì´ ìì ì stringìì ííìì´ ë ê° ì½ì
ëìì¼ë¯ë¡
// ${age} ë¤ìë ''ì¸ stringì´ ì¡´ì¬íì¬
// 기ì ì ì¼ë¡ strings ë°°ì´ì í¬ê¸°ë 3ì´ ë©ëë¤.
// íì§ë§ ë¹ stringì´ë¯ë¡ 무ìíê² ìµëë¤.
// var str2 = strings[2];
var ageStr;
if (ageExp > 99) {
ageStr = "centenarian";
} else {
ageStr = "youngster";
}
// ì¬ì§ì´ ì´ í¨ìë´ììë template literalì ë°íí ì ììµëë¤.
return str0 + personExp + str1 + ageStr;
}
var output = myTag`that ${person} is a ${age}`;
console.log(output);
// that Mike is a youngster
ë¤ì ìììì ë³´ì¬ì§ë¯ì´, Tag function ë¤ì string ì ë°íí íìë ììµëë¤.
function template(strings, ...keys) {
return function (...values) {
var dict = values[values.length - 1] || {};
var result = [strings[0]];
keys.forEach(function (key, i) {
var value = Number.isInteger(key) ? values[key] : dict[key];
result.push(value, strings[i + 1]);
});
return result.join("");
};
}
var t1Closure = template`${0}${1}${0}!`;
t1Closure("Y", "A"); // "YAY!"
var t2Closure = template`${0} ${"foo"}!`;
t2Closure("Hello", { foo: "World" }); // "Hello World!"
Raw strings
íê·¸ ì§ì ë í
í릿ì 첫 ë²ì§¸ í¨ì ì¸ììì ì¬ì©í ììë í¹ë³í raw
propertyì ì¬ì©íë©´ escape sequences ì²ë¦¬íì§ ìê³ ìì 문ìì´ì ì
ë ¥ íëë¡ ì¡ì¸ì¤ í ì ììµëë¤.
function tag(strings) {
console.log(strings.raw[0]);
}
tag`string text line 1 \n string text line 2`;
// logs "string text line 1 \n string text line 2" ,
// including the two characters '\' and 'n'
ì¶ê°ë¡, default template function ê³¼ string ë³í©ì¼ë¡ ìì±ë ê² ê°ì raw string ì ìì±í기 ìí String.raw()
methodê° ì¡´ì¬í©ëë¤.
var str = String.raw`Hi\n${2 + 3}!`;
// "Hi\n5!"
str.length;
// 6
str.split("").join(",");
// "H,i,\,n,5,!"
Tagged templates and escape sequences ES2016 behavior
ECMAScript 2016ìì tagged templatesì ë¤ì escape sequencesì ê·ì¹ì ë°ë¦ ëë¤.
\u00A9
\u{2F804}
\xA9
\251
ì´ë ë¤ìê³¼ ê°ì tagged templateì´ ë¬¸ì ê° ëë¤ë ê²ì ì미íëë°, ECMAScript문ë²ì ë°ë¼, parserë ì í¨í ì ë ì½ë íì¶ ìíì¤ê° ìëì§ íì¸íì§ë§ íìì´ ì못ëì기 ë문ì ì¤ë¥ê° ë°ìí©ëë¤.
latex`\unicode` // Throws in older ECMAScript versions (ES2016 and earlier) // SyntaxError: malformed Unicode character escape sequenceES2018 revision of illegal escape sequences
Tagged templatesì ë¤ë¥¸ escapes sequencesê° ì¼ë°ì ì¼ë¡ ì¬ì©ëë ì¸ì´ (ì : DSLs ëë LaTeX)ì ìë² ë©ì íì©í´ì¼í©ëë¤. ECMAScript proposal Template Literal Revision (4 ë¨ê³, ECMAScript 2018 íì¤ì íµí©ë¨)ì tagged templatesìì ECMAScript escape sequencesì 구문 ì íì ì ê±°í©ëë¤.
ê·¸ë¬ë illegal escape sequencesë ì¬ì í "cooked"ë¼ê³ ííëì´ì¼í©ëë¤. "cooked"ë°°ì´ì undefined
ììë¡ ëíë©ëë¤ :
function latex(str) {
return { cooked: str[0], raw: str.raw[0] };
}
latex`\unicode`;
// { cooked: undefined, raw: "\\unicode" }
escape sequence ì íì tagged templatesìë§ ì ì©ëë©° untagged template literalsìë ì ì©ëì§ ììµëë¤.
ê²½ê³ : let bad = bad escape sequence: \unicode
;
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4