樣æ¿åé¢å¼
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2015å¹´9æ.
樣æ¿åé¢å¼ï¼Template literalsï¼æ¯å 許åµå ¥éç®å¼çå串åé¢å¼ï¼string literalsï¼ãä½ å¯ä»¥é鿍£æ¿åé¢å¼ä¾ä½¿ç¨å¤è¡å串ååä¸²å §æï¼string interpolationï¼åè½ãä»åå¨ ES2015 è¦ç¯çå è¡çæ¬ä¸è¢«ç¨±çºã樣æ¿å串ï¼template stringsï¼ãã
èªæ³
`string text`
`string text line 1
string text line 2`
`string text ${expression} string text`
tag `string text ${expression} string text`
æè¿°
樣æ¿åé¢å¼ï¼Template literalsï¼è¢«åå¼èï¼back-tickï¼éé³ç¬¦èï¼ï¼` ` åå
å°éï¼ä»£æ¿äºéæå®å¼èãæ¨£æ¿åé¢å¼å¯ä»¥å
å«ç±é¢åå
åè±æ¬èææ§æï¼${expression}ï¼çä½ä½ç¬¦ï¼placeholdersï¼ãéåå¨ä½ä½ç¬¦ä¸çéç®å¼ä»¥åå¨å®åä¹éçæåæè¢«å³å
¥ä¸åå½å¼ãé è¨å½å¼åªæ¯å°éäºé¨åçµåæä¸åå®ä¸çå串ã妿卿¨£æ¿åé¢å¼åæä¸åéç®å¼ï¼tag hereï¼ï¼åæ¤æ¨£æ¿å串被稱çºãæ¨ç±¤æ¨£æ¿åé¢å¼ï¼tagged template literalï¼ãã卿¤æ
æ³ä¸ï¼æ¨ç±¤éç®å¼ï¼é常æ¯ä¸åå½å¼ï¼æè¢«å¼å«ä¾èçæ¨£æ¿åé¢å¼ï¼è®ä½ å¯ä»¥å¨å½å¼åå³ä¹åé²è¡æä½ãè¦å¨æ¨£æ¿åé¢å¼ä¸è·³è«ä¸ååå¼èï¼å¯ä»¥æ¼åå¼èåå ä¸ä¸ååæç·ï¼backslashï¼\ ã
`\`` === "`"; // --> true
å¤è¡å串
ä»»ä½å¨æ¨£æ¿åé¢å¼ä¸ä½¿ç¨ãæå ¥çæè¡ç¬¦èï¼é½æ¯æ¨£æ¿åé¢å¼çä¸é¨ä»½ã卿®éçå串ä¸ï¼æåéè¦ä½¿ç¨å¦ä¸çèªæ³ä»¥éå°æè¡çææï¼
console.log("string text line 1\n" + "string text line 2");
// "string text line 1
// string text line 2"
ä½ä½¿ç¨æ¨£æ¿åé¢å¼ï¼ä½ åªéè¦æ°å¯«å¦ä¸æç¤ºçç¨å¼ç¢¼ï¼å°±è½éå°åæ¨£çææï¼
console.log(`string text line 1
string text line 2`);
// "string text line 1
// string text line 2"
éç®å¼å §æ
è¦å¨æ®éçå串ä¸å §åµéç®å¼ï¼æåå¿ é 使ç¨å¦ä¸èªæ³ï¼
var a = 5;
var b = 10;
console.log("Fifteen is " + (a + b) + " and\nnot " + (2 * a + b) + ".");
// "Fifteen is 15 and
// not 20."
ç¾å¨æäºæ¨£æ¿åé¢å¼ï¼æåå¯ä»¥ç¨ä¸ç¨®æ´åªé ç寫æ³ï¼è®èªæ³æ´å ·å¯è®æ§ï¼
var a = 5;
var b = 10;
console.log(`Fifteen is ${a + b} and
not ${2 * a + b}.`);
// "Fifteen is 15 and
// not 20."
å·¢çæ¨£æ¿
In certain times, nesting a template is the easiest and perhaps more readable way to have configurable strings. Within a backticked template it is simple to allow inner backticks simply by using them inside a placeholder ${ } within the template. For instance, if condition a is true: then return this templated literal.
In ES5:
var classes = "header";
classes += isLargeScreen()
? ""
: item.isCollapsed
? " icon-expander"
: " icon-collapser";
In ES2015 with template literals and without nesting:
const classes = `header ${
isLargeScreen() ? "" : item.isCollapsed ? "icon-expander" : "icon-collapser"
}`;
In ES2015 with nested template literals:
const classes = `header ${
isLargeScreen() ? "" : `icon-${item.isCollapsed ? "expander" : "collapser"}`
}`;
æ¨ç±¤æ¨£æ¿åé¢å¼
æ¨ç±¤æ¨£æ¿åé¢å¼æ¯ä¸ç¨®æ´é«ç´ç樣æ¿åé¢å¼å½¢å¼ï¼å è¨±ä½ ééæ¨ç±¤å½æ¸æä½æ¨£æ¿åé¢å¼ç輸åºãæ¨ç±¤å½æ¸ç第ä¸å忏æ¯ä¸å串é£åï¼å ¶é¤åæ¸åæ¯èçéç表éå¼ãæçµï¼ä½ å¯ä»¥è¿åä¸åç¶èçå¾çå串ï¼çè³æ¯å®å ¨ä¸ä¸æ¨£çæ±è¥¿ï¼å¦ä¸è¿°ç¬¬äºåç¯ä¾ä¸ï¼ãæ¨ç±¤å½æ¸çå稱å¯ä»¥æ¯ä»»ä½ä½ æ³è¦çã
var person = "Mike";
var age = 28;
function myTag(strings, personExp, ageExp) {
var str0 = strings[0]; // "that "
var str1 = strings[1]; // " is a "
// There is technically a string after
// the final expression (in our example),
// but it is empty (""), so disregard.
// var str2 = strings[2];
var ageStr;
if (ageExp > 99) {
ageStr = "centenarian";
} else {
ageStr = "youngster";
}
return str0 + personExp + str1 + ageStr;
}
var output = myTag`that ${person} is a ${age}`;
console.log(output);
// that Mike is a youngster
æ¨ç±¤å½æ¸ä¸ä¸å®è¦åå³ä¸åå串ï¼å¦ä¸åç¯ä¾ï¼
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 ãï¼å
è¨±ä½ ç²ååå§è¼¸å
¥çãæªèçä»»ä½è½ç¾©åºåçå串å¼ã
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'
æ¤å¤, ä½¿ç¨ String.raw() æ¹æ³å»ºç«çåå§å串ï¼ä¹èé è¨ç樣æ¿å½æ¸ååä¸²ä¸²æ¥æå»ºç«çå串ç¸åã
var str = String.raw`Hi\n${2 + 3}!`;
// "Hi\n5!"
str.length;
// 6
str.split("").join(",");
// "H,i,\,n,5,!"
æ¨ç±¤æ¨£æ¿åé¢å¼åè·³è«åºå
å¨ ES2016 çè¦ç¯ä¸ï¼æ¨ç±¤æ¨£æ¿åé¢å¼éµå®ä¸åè·³è«åºåï¼escape sequencesï¼è¦åï¼
- è¬å碼 (Unicode) è·³è«åºåç± "\u" ä½çºéé , ä¾ï¼
\u00A9 - è¬åç¢¼ä½ (Unicode code point) ç± "\u{}" ä½çºéé , ä¾ï¼
\u{2F804} - åå
é²ä½å¶ç¢¼ç± "\x" ä½çºéé , ä¾ï¼
\xA9 - åé²ä½å¶ç¢¼ç± "\" ä½çºéé , ä¾ï¼ \251
éè¡¨ç¤ºåæ¯ä¸è¿°çæ¨ç±¤æ¨£æ¿åé¢å¼æ¯æåé¡çï¼å çºæ ¹æ ECMAScript è¦ç¯ï¼ä¸åèªæ³åæå¨æå試以è¬å碼è½ç¾©åºåå»è§£æå®ï¼ç¶å¾ç¼ç¾åºåæèª¤ï¼
latex`\unicode`;
// Throws in older ECMAScript versions (ES2016 and earlier)
// SyntaxError: malformed Unicode character escape sequence
Tagged template literals should allow the embedding of languages (for example DSLs, or LaTeX), where other escapes sequences are common. The ECMAScript proposal Template Literal Revision (stage 4, to be integrated in the ECMAScript 2018 standard) removes the syntax restriction of ECMAScript escape sequences from tagged template literals.
However, illegal escape sequence must still be represented in the "cooked" representation. They will show up as undefined element in the "cooked" array:
l be represented in the "cooked" representation. They will show up as undefined element in the "cooked" array:
function latex(str) {
return { cooked: str[0], raw: str.raw[0] };
}
latex`\unicode`;
// { cooked: undefined, raw: "\\unicode" }
Note that the escape sequence restriction is only dropped from tagged template literals and not from untagged template literals:
let bad = `bad escape sequence: \unicode`;
è¦ç¯
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-template-literals> |