Baseline Widely available
模æ¿åé¢éæ¯ç¨åå¼å·ï¼`
ï¼åéçåé¢éï¼å
许å¤è¡å符串ã带åµå
¥è¡¨è¾¾å¼çå符串æå¼åä¸ç§å«å¸¦æ ç¾ç模æ¿çç¹æ®ç»æã
模æ¿åé¢éææ¶è¢«éæ£å¼å°å«ä½æ¨¡æ¿å符串ï¼å 为å®ä»¬æå¸¸è¢«ç¨ä½å符串æå¼ï¼éè¿æ¿æ¢å ä½ç¬¦æ¥å建å符串ï¼ãç¶èï¼å¸¦æ ç¾ç模æ¿åé¢éå¯è½ä¸ä¼äº§çå符串ââå®å¯ä»¥ä¸èªå®ä¹æ ç¾å½æ°ä¸èµ·ä½¿ç¨ï¼æ¥å¯¹æ¨¡æ¿åé¢éçä¸åé¨åæ§è¡ä»»ä½æä½ã
è¯æ³`string text`
`string text line 1
string text line 2`
`string text ${expression} string text`
tagFunction`string text ${expression} string text`
åæ°
string text
å°æä¸ºæ¨¡æ¿åé¢éçä¸é¨åçåç¬¦ä¸²ææ¬ãå ä¹å 许ææå符ï¼å æ¬æ¢è¡ç¬¦åå ¶ä»ç©ºç½å符ã使¯ï¼é¤é使ç¨äºæ ç¾å½æ°ï¼å¦åæ æç转ä¹åºåå°å¯¼è´è¯æ³é误ã
expression
è¦æå
¥å½åä½ç½®ç表达å¼ï¼å
¶å¼è¢«è½¬æ¢ä¸ºå符串æä¼ éç» tagFunction
ã
tagFunction
妿æå®ï¼å°ä½¿ç¨æ¨¡æ¿å符串æ°ç»åæ¿æ¢è¡¨è¾¾å¼è°ç¨å®ï¼è¿åå¼å°æä¸ºæ¨¡æ¿åé¢éçå¼ãè§å¸¦æ ç¾ç模æ¿ã
模æ¿åé¢éç¨åå¼å·ï¼`
ï¼æ¬èµ·æ¥ï¼è䏿¯åå¼å·ï¼"
ï¼æåå¼å·ï¼'
ï¼ã é¤äºæ®éå符串å¤ï¼æ¨¡æ¿åé¢éè¿å¯ä»¥å
å«å ä½ç¬¦ââä¸ç§ç±ç¾å
符å·å大æ¬å·åéçåµå
¥å¼è¡¨è¾¾å¼ï¼${expression}
ãå符串åå ä½ç¬¦è¢«ä¼ éç»ä¸ä¸ªå½æ°ï¼è¦ä¹æ¯é»è®¤å½æ°ï¼è¦ä¹æ¯èªå®ä¹å½æ°ï¼ãé»è®¤å½æ°ï¼å½æªæä¾èªå®ä¹å½æ°æ¶ï¼åªæ§è¡å符串æå¼æ¥æ¿æ¢å ä½ç¬¦ï¼ç¶åå°è¿äºé¨åæ¼æ¥å°ä¸ä¸ªå符串ä¸ã
è¥è¦æä¾èªå®ä¹å½æ°ï¼é卿¨¡æ¿åé¢éä¹åå ä¸å½æ°åï¼ç»æè¢«ç§°ä¸ºå¸¦æ ç¾ç模æ¿ï¼ãæ¤æ¶ï¼æ¨¡æ¿åé¢éè¢«ä¼ éç»ä½ çæ ç¾å½æ°ï¼ç¶åå°±å¯ä»¥å¨é£éå¯¹æ¨¡æ¿ææ¬çä¸åé¨åæ§è¡ä»»ä½æä½ã
è¥è¦è½¬ä¹æ¨¡æ¿åé¢éä¸çåå¼å·ï¼`
ï¼ï¼éå¨åå¼å·ä¹åå ä¸ä¸ªåææ ï¼\
ï¼ã
ç¾å
ç¬¦å· $
ä¹å¯ä»¥è¢«è½¬ä¹ï¼æ¥é»æ¢æå¼ã
`\${1}` === "${1}"; // 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"
å符串æå¼
å¦ææ²¡ææ¨¡æ¿åé¢éï¼å½ä½ æ³ç»å表达å¼çè¾åºä¸å符串æ¶ï¼å¯ä»¥ä½¿ç¨å æ³è¿ç®ç¬¦ +
è¿æ¥å®ä»¬ï¼
const a = 5;
const b = 10;
console.log("Fifteen is " + (a + b) + " and\nnot " + (2 * a + b) + ".");
// "Fifteen is 15 and
// not 20."
è¿å¯è½å¾é¾é 读ï¼å°¤å ¶æ¯å½åå¨å¤ä¸ªè¡¨è¾¾å¼æ¶ã
æäºæ¨¡æ¿åé¢éï¼å°±å¯ä»¥éè¿ä½¿ç¨å ä½ç¬¦ ${expression}
åµå
¥å¾
æ¿æ¢ç表达å¼ï¼ä»èé¿å
串èè¿ç®ç¬¦ï¼å¹¶æé«ä»£ç çå¯è¯»æ§ï¼
const a = 5;
const b = 10;
console.log(`Fifteen is ${a + b} and
not ${2 * a + b}.`);
// "Fifteen is 15 and
// not 20."
注æï¼è¿ä¸¤ç§è¯æ³æä¸ç¹å°åºå«ï¼æ¨¡æ¿åé¢éç´æ¥å°å
¶è¡¨è¾¾å¼å¼ºå¶è½¬æ¢ä¸ºå符串ï¼èå æ³åä¼å
强å¶è½¬æ¢ä¸ºåè¯ç±»åãæ´å¤ç¸å
³ä¿¡æ¯ï¼åè§å æ³ï¼+
ï¼è¿ç®ç¬¦ã
å¨æäºæ
åµä¸ï¼åµå¥æ¨¡æ¿æ¯å
·æå¯é
ç½®å符串çæç®åçï¼ä¹è®¸è¿æ¯æ´å¯è¯»çï¼æ¹æ³ãå¨åå¼å·åéçæ¨¡æ¿ä¸ï¼å
许å¨å ä½ç¬¦ ${expression}
ä¸ä½¿ç¨å
å±çåå¼å·ã
ä¾å¦ï¼ä¸ç¨æ¨¡æ¿åé¢éçæ åµä¸ï¼å¦æä½ æ³æ ¹æ®ç¹å®æ¡ä»¶è¿åæä¸ªå¼ï¼å¯ä»¥æ§è¡ä»¥ä¸æä½ï¼
let classes = "header";
classes += isLargeScreen()
? ""
: item.isCollapsed
? " icon-expander"
: " icon-collapser";
ç¨æ¨¡æ¿åé¢éä½ä¸åµå¥æ¶ï¼ä½ å¯ä»¥è¿ä¹åï¼
const classes = `header ${
isLargeScreen() ? "" : item.isCollapsed ? "icon-expander" : "icon-collapser"
}`;
ç¨åµå¥æ¨¡æ¿åé¢éæ¶ï¼ä½ å¯ä»¥è¿ä¹åï¼
const classes = `header ${
isLargeScreen() ? "" : `icon-${item.isCollapsed ? "expander" : "collapser"}`
}`;
带æ ç¾ç模æ¿
带æ ç¾çæ¨¡æ¿æ¯æ¨¡æ¿åé¢éçä¸ç§æ´é«çº§çå½¢å¼ï¼å®å è®¸ä½ ä½¿ç¨å½æ°è§£ææ¨¡æ¿åé¢éãæ ç¾å½æ°ç第ä¸ä¸ªåæ°å å«ä¸ä¸ªå符串æ°ç»ï¼å ¶ä½çåæ°ä¸è¡¨è¾¾å¼ç¸å ³ãä½ å¯ä»¥ç¨æ ç¾å½æ°å¯¹è¿äºåæ°æ§è¡ä»»ä½æä½ï¼å¹¶è¿å被æä½è¿çåç¬¦ä¸²ï¼æè ï¼ä¹å¯è¿åå®å ¨ä¸åçå 容ï¼è§ä¸é¢ç示ä¾ï¼ãç¨ä½æ ç¾ç彿°å没æéå¶ã
const person = "Mike";
const age = 28;
function myTag(strings, personExp, ageExp) {
const str0 = strings[0]; // "That "
const str1 = strings[1]; // " is a "
const str2 = strings[2]; // "."
const ageStr = ageExp > 99 ? "centenarian" : "youngster";
// æä»¬çè³å¯ä»¥è¿åä½¿ç¨æ¨¡æ¿åé¢éæå»ºçå符串
return `${str0}${personExp}${str1}${ageStr}${str2}`;
}
const output = myTag`That ${person} is a ${age}.`;
console.log(output);
// That Mike is a youngster.
æ ç¾ä¸å¿ æ¯æ®éçæ è¯ç¬¦ï¼ä½ å¯ä»¥ä½¿ç¨ä»»ä½ä¼å çº§å¤§äº 16 ç表达å¼ï¼å æ¬å±æ§è®¿é®ã彿°è°ç¨ãnew 表达å¼ï¼çè³å ¶ä»å¸¦æ ç¾ç模æ¿åé¢éã
console.log`Hello`; // [ 'Hello' ]
console.log.bind(1, 2)`Hello`; // 2 [ 'Hello' ]
new Function("console.log(arguments)")`Hello`; // [Arguments] { '0': [ 'Hello' ] }
function recursive(strings, ...values) {
console.log(strings, values);
return recursive;
}
recursive`Hello``World`;
// [ 'Hello' ] []
// [ 'World' ] []
è½ç¶è¯æ³ä»ææ¯ä¸å
许è¿ä¹åï¼ä½ä¸å¸¦æ ç¾ç模æ¿åé¢éæ¯å符串ï¼å¹¶ä¸å¨é¾å¼è°ç¨æ¶ä¼æåº TypeError
ã
console.log(`Hello``World`); // TypeError: "Hello" is not a function
å¯ä¸çä¾å¤æ¯å¯éé¾ï¼è¿å°æåºè¯æ³é误ã
console.log?.`Hello`; // SyntaxError: Invalid tagged template on optional chain
console?.log`Hello`; // SyntaxError: Invalid tagged template on optional chain
请注æï¼è¿ä¸¤ä¸ªè¡¨è¾¾å¼ä»ç¶æ¯å¯è§£æçãè¿æå³çå®ä»¬å°ä¸åèªå¨åå·è¡¥å ¨çå½±åï¼å ¶åªä¼æå ¥åå·æ¥ä¿®å¤æ æ³è§£æç代ç ã
// 仿¯è¯æ³é误
const a = console?.log
`Hello`
æ ç¾å½æ°çè³ä¸éè¦è¿åå符串ï¼
function template(strings, ...keys) {
return (...values) => {
const dict = values[values.length - 1] || {};
const result = [strings[0]];
keys.forEach((key, i) => {
const value = Number.isInteger(key) ? values[key] : dict[key];
result.push(value, strings[i + 1]);
});
return result.join("");
};
}
const t1Closure = template`${0}${1}${0}!`;
// const t1Closure = template(["","","","!"],0,1,0);
t1Closure("Y", "A"); // "YAY!"
const t2Closure = template`${0} ${"foo"}!`;
// const t2Closure = template([""," ","!"],0,"foo");
t2Closure("Hello", { foo: "World" }); // "Hello World!"
const t3Closure = template`I'm ${"name"}. I'm almost ${"age"} years old.`;
// const t3Closure = template(["I'm ", ". I'm almost ", " years old."], "name", "age");
t3Closure("foo", { name: "MDN", age: 30 }); // "I'm MDN. I'm almost 30 years old."
t3Closure({ name: "MDN", age: 30 }); // "I'm MDN. I'm almost 30 years old."
æ ç¾å½æ°æ¥æ¶å°ç第ä¸ä¸ªåæ°æ¯ä¸ä¸ªå符串æ°ç»ã对äºä»»ä½æ¨¡æ¿åé¢éï¼å
¶é¿åº¦çäºæ¿æ¢æ¬¡æ°ï¼${â¦}
åºç°æ¬¡æ°ï¼å ä¸ï¼å æ¤æ»æ¯é空çã对äºä»»ä½ç¹å®ç带æ ç¾ç模æ¿åé¢é表达å¼ï¼æ 论对åé¢éæ±å¼å¤å°æ¬¡ï¼é½å°å§ç»ä½¿ç¨å®å
¨ç¸åçåé¢éæ°ç»è°ç¨æ ç¾å½æ°ã
const callHistory = [];
function tag(strings, ...values) {
callHistory.push(strings);
// Return a freshly made object
return {};
}
function evaluateLiteral() {
return tag`Hello, ${"world"}!`;
}
console.log(evaluateLiteral() === evaluateLiteral()); // false; each time `tag` is called, it returns a new object
console.log(callHistory[0] === callHistory[1]); // true; all evaluations of the same tagged literal would pass in the same strings array
è¿å
许æ ç¾å½æ°ä»¥å
¶ç¬¬ä¸ä¸ªåæ°ä½ä¸ºæ è¯æ¥ç¼åç»æã为äºè¿ä¸æ¥ç¡®ä¿æ°ç»å¼ä¸åï¼ç¬¬ä¸ä¸ªåæ°åå
¶ raw
屿§é½ä¼è¢«å»ç»ï¼å æ¤ä½ å°æ æ³æ¹åå®ä»¬ã
卿 ç¾å½æ°ç第ä¸ä¸ªåæ°ä¸ï¼åå¨ä¸ä¸ªç¹æ®ç屿§ 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()
æ¹æ³å建åå§å符串å使ç¨é»è®¤æ¨¡æ¿å½æ°ååç¬¦ä¸²è¿æ¥å建æ¯ä¸æ ·çã
let str = String.raw`Hi\n${2+3}!`;
// "Hi\\n5!"
str.length;.
// 6
str.split('').join(',');.
// "H,i,\\,n,5,!"
妿åé¢éä¸å
å«ä»»ä½è½¬ä¹åºåï¼String.raw
彿°å°±åä¸ä¸ªâidentityâæ ç¾ãå¦æä½ æ³è¦ä¸ä¸ªå§ç»åä¸å¸¦æ ç¾çåé¢é飿 ·çå®é
æ è¯æ ç¾ï¼å¯ä»¥ç¨èªå®ä¹å½æ°ï¼å°âcookedâï¼ä¾å¦ï¼ç»è½¬ä¹åºåå¤çè¿çï¼åé¢éæ°ç»ä¼ éç» String.raw
ï¼å°å®ä»¬å½æåå§å符串ã
const identity = (strings, ...values) =>
String.raw({ raw: strings }, ...values);
console.log(identity`Hi\n${2 + 3}!`);
// Hi
// 5!
è¿å¯¹äºè®¸å¤å·¥å ·æ¥è¯´å¾æç¨ï¼å®ä»¬è¦å¯¹ä»¥ç¹å®å称为æ ç¾çåé¢éä½ç¹æ®å¤çã
const html = (strings, ...values) => String.raw({ raw: strings }, ...values);
// ä¸äºæ ¼å¼åç¨åºä¼å°æ¤åé¢éçå
å®¹æ ¼å¼å为 HTML
const doc = html`<!doctype html>
<html lang="en-US">
<head>
<title>Hello</title>
</head>
<body>
<h1>Hello world!</h1>
</body>
</html>`;
带æ ç¾ç模æ¿åé¢éå转ä¹åºå
卿®é模æ¿åé¢éä¸ï¼å符串åé¢éä¸ç转ä¹åºå齿¯å 许çï¼ä»»ä½å ¶ä»æ ¼å¼ä¸æ£ç¡®ç转ä¹åºå齿¯è¯æ³é误ï¼å æ¬ï¼
\
åè· 0
以å¤çä»»ä½åè¿å¶æ°åï¼æ \0
åè·ä¸ä¸ªåè¿å¶æ°åï¼ä¾å¦ \9
å \07
ï¼è¿æ¯ä¸ç§å·²å¼ç¨çè¯æ³ï¼\x
åè·ä¸¤ä½ä»¥ä¸åå
è¿å¶æ°åï¼ä¾å¦\xz
\u
åä¸è· {
ï¼å¹¶ä¸åè·å个以ä¸åå
è¿å¶æ°åï¼ä¾å¦ \uz
\u{}
å
嫿 æç Unicode ç ç¹ââå
å«ä¸ä¸ªéåå
è¿å¶æ°åï¼æè
å®çå¼å¤§äº 10FFFFï¼ä¾å¦ \u{110000}
å \u{z}
夿³¨ï¼ \
åé¢è·çå
¶ä»å符ï¼è½ç¶å®ä»¬å¯è½æ²¡æç¨ï¼å 为没æè½¬ä¹ï¼ä½å®ä»¬ä¸æ¯è¯æ³é误ã
ç¶èï¼è¿å¯¹äºå¸¦æ ç¾çæ¨¡æ¿æ¥è¯´æ¯æé®é¢çï¼é¤äºâcookedâåé¢éå¤ï¼è¿äºæ¨¡æ¿è¿å¯ä»¥è®¿é®åå§åé¢éï¼è½¬ä¹åºåæåæ ·ä¿çï¼ã带æ ç¾ç模æ¿åºè¯¥å 许åµå ¥è¯è¨ï¼ä¾å¦ DSL æ LaTeXï¼ï¼å¨è¿äºè¯è¨éå ¶ä»è½¬ä¹åºåæ¯å¸¸è§çãå æ¤ï¼ä»å¸¦æ ç¾ç模æ¿ä¸å é¤äºè½¬ä¹åºåè¯¸å¤æ ¼å¼çè¯æ³éå¶ã
ä¸è¿ï¼éæ³è½¬ä¹åºåå¨âcookedâå½ä¸ä»ç¶ä¼ä½ç°åºæ¥ãå®ä»¬å°ä»¥ undefined
å
ç´ çå½¢å¼åå¨äºâcookedâæ°ç»ä¹ä¸ï¼
function latex(str) {
return { cooked: str[0], raw: str.raw[0] };
}
latex`\unicode`;
// { cooked: undefined, raw: "\\unicode" }
å¼å¾æ³¨æçæ¯ï¼è¿ä¸è½¬ä¹åºåéå¶åªå¯¹å¸¦æ ç¾ç模æ¿åé¢éç§»é¤ï¼èä¸å æ¬ä¸å¸¦æ ç¾ç模æ¿åé¢éï¼
const 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