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"
éå¸¸ã®æååãªãã©ã«ã¨åæ§ã«ãã½ã¼ã¹ã³ã¼ãã®å¯èªæ§ãé«ããããã«ãæ¹è¡ãããã¯ã¹ã©ãã·ã¥ (\
) ã§ã¨ã¹ã±ã¼ããããã¨ã§ãåä¸è¡ã®æååãè¤æ°è¡ã«ããã£ã¦è¨è¿°ãããã¨ãã§ãã¾ãã
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."
2 ã¤ã®æ§æã«ã¯è»½å¾®ãªéãããããã¨ã«æ³¨æãã¦ãã ããã ãã³ãã¬ã¼ããªãã©ã«ã¯ããã®å¼ãç´æ¥æååã«å¤æãã¾ãããå ç®ã§ã¯ã¾ããªãã©ã³ããããªããã£ãã«å¤æãã¾ãã 詳細ã¯ã +
æ¼ç®åã®ãªãã¡ã¬ã³ã¹ãã¼ã¸ãã覧ãã ããã
å ´åã«ãã£ã¦ã¯ããã³ãã¬ã¼ããå
¥ãåã«ããã¨ãæ§æå¯è½ãªæååãå¾ãã®ã«ãã£ã¨ãç°¡åã«ï¼ãã¤ãããããããèªã¿ãããï¼ãªããã¨ãããã¾ããéå¼ç¨ç¬¦ã§åºåããããã³ãã¬ã¼ãã§ã¯ããã³ãã¬ã¼ãå
ã«ãããã¬ã¤ã¹ãã«ãã¼ ${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 < 100 ? "youngster" : "centenarian";
// ãã³ãã¬ã¼ããªãã©ã«ãç¨ãã¦çµã¿ç«ã¦ãæååãè¿ããã¨ãã§ãã¾ã
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
ãªããæ¬¡ã® 2 ã¤ã®å¼ã¯ä¾ç¶ã¨ãã¦è§£éå¯è½ã§ããã¤ã¾ããèªåã»ãã³ãã³æ¿å ¥ã®å¯¾è±¡ã«ã¯ãªãã¾ãããèªåã»ãã³ãã³æ¿å ¥ã¯ãè§£éä¸å¯è½ãªã³ã¼ããä¿®æ£ããããã«ã®ã¿ã»ãã³ãã³ãæ¿å ¥ãã¾ãã
// Still a syntax error
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."
ã¿ã°é¢æ°ã®å
é ã®å¼æ°ã¯ãæååã®é
åã§ããã©ã®ãã³ãã¬ã¼ããªãã©ã«ã§ãããã®é·ãã¯ç½®æã®æ°ï¼${â¦}
ã®çºçåæ°ï¼ã« 1 ãå ãããã®ã¨åãã§ããããããã£ã¦å¸¸ã«ç©ºã§ã¯ããã¾ããã
ã¿ã°ä»ãã®ãã³ãã¬ã¼ããªãã©ã«å¼ã«ã¤ãã¦ã¯ããã®ãªãã©ã«ãä½åº¦è©ä¾¡ããã¦ããã¿ã°é¢æ°ã¯å¸¸ã«ã¾ã£ããåããªãã©ã«é åã弿°ã¨ãã¦å¼ã³åºããã¾ãã
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ã `tag` ãå¼ã³åºããããã³ã«æ°ãããªãã¸ã§ã¯ããè¿ã
console.log(callHistory[0] === callHistory[1]); // trueã åãã¿ã°ä»ããªãã©ã«ã®ãã¹ã¦ã®è©ä¾¡ã¯ãåãæååé
åã«æ ¼ç´ããã¾ãã
ããã«ãããã¿ã°ã¯ç¬¬ 1 弿°ã®èå¥åã«åºã¥ãã¦çµæããã£ãã·ã¥ãããã¨ãã§ãã¾ããé
åå¤ã®å®å®æ§ãããã«ä¿è¨¼ããããã«ã第 1 弿°ã¨ raw
ããããã£ã¯ã©ã¡ããåçµããã夿´ãããã¨ã¯ã§ãã¾ããã
ã¿ã°é¢æ°ã«æ¸¡ããã第 1 弿°ã§ã¯ãç¹å¥ãª 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()
ã¡ã½ããããããæ¢å®ã®ãã³ãã¬ã¼ã颿°ã®ããã«æååãé£çµããå½¢ã§å å·¥åã®æååãçæãããã¨ãã§ãã¾ãã
const str = String.raw`Hi\n${2 + 3}!`;
// "Hi\\n5!"
str.length;
// 6
Array.from(str).join(",");
// "H,i,\\,n,5,!"
ãªãã©ã«ã«ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ãå«ã¾ãã¦ããªãå ´åãString.raw
颿°ã¯ "identity" ã¿ã°ã®ããã«æ©è½ãã¾ãã ãªãã©ã«ã«ã¿ã°ãä»ããªãå ´åã¨åæ§ã«å¸¸ã«ãã¾ãããå®éã® identity ã¿ã°ãå¿
è¦ãªå ´åã¯ãã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ãå¦çããããå å·¥ãããããªãã©ã«é
åã 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
ã« 2 æ¡ä»¥ä¸ï¼ãªããã®ãå«ãï¼ã® 16 鲿°ãç¶ãããã®ãä¾ãã° \xz
\u
ã« {
ãç¶ããã 4 æ¡ä»¥ä¸ï¼ãªããã®ãå«ãï¼ã® 16 鲿°ãéã¥ãããã®ãä¾ãã° \uz
\u{}
ã§æå¹ãª Unicode ã³ã¼ããã¤ã³ããå²ãã ãã®ãããã«ã¯ 16 鲿°ä»¥å¤ã®ãã®ãã¾ã¦ãã 10FFFF
以ä¸ã®å¤ãä¾ãã° \u{110000}
ã \u{z}
ã¡ã¢: \
ã«ä»ã®æåãç¶ãã¨ãä½ãã¨ã¹ã±ã¼ãããã¦ããªãã®ã§ãç¡æå³ããããã¾ããããæ§æã¨ã©ã¼ã§ã¯ããã¾ããã
ããããããã¯ã¿ã°ä»ããã³ãã¬ã¼ãã«ã¨ã£ã¦ã¯åé¡ã§ãããå å·¥æ¸ã¿ããªãã©ã«ã«å ãã¦ãçã®ãªãã©ã«ã«ãã¢ã¯ã»ã¹ã§ããããã§ãï¼ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ã¯ãã®ã¾ã¾ä¿æããã¾ãï¼ã
ã¿ã°ä»ããã³ãã¬ã¼ãã§ã¯ãä»»æã®æååã³ã³ãã³ããåãè¾¼ããã¨ãã§ããã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ã¯ç°ãªãæ§æã«å¾ããã¨ãããã¾ããä¾ãã°ãString.raw
ã使ç¨ã㦠JavaScript ã§ LaTeX ã®ã½ã¼ã¹ããã¹ããåãè¾¼ãå ´åãèãã¦ã¿ã¾ããããJavaScript ã®æ§æå¶éã«å¾ããã¨ãªããu
ã¾ã㯠x
ã§å§ã¾ã LaTeX ãã¯ãã使ç¨ã§ããããã«ãããå ´åãããã¾ãããã®ãããã¿ã°ä»ããã³ãã¬ã¼ãã§ã¯ãæ£ããå½¢æãããã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ã®æ§æå¶éãè§£é¤ããã¾ããä¸è¨ã¯ãMathJax ã使ç¨ã㦠LaTeX ã 1 ã¤ã®è¦ç´ ã§ã¬ã³ããªã³ã°ããä¾ã§ãã
const node = document.getElementById("formula");
MathJax.typesetClear([node]);
// å¤ã ECMAScript ãã¼ã¸ã§ã³ (ES2016 以å) ã§ã¯ã以ä¸ã®ãããªä¾å¤ãæãããã
// SyntaxError: malformed Unicode character escape sequence
node.textContent = String.raw`$\underline{u}$`;
MathJax.typesetPromise([node]);
ããããåãè¾¼ãã§ãå å·¥ããããçµæã®ä¸ã«ããã¦ãã䏿£ãªã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ãããã°ããããæç¤ºããå¿
è¦ãããã¾ãããããã䏿£ãªã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ã¯ããå å·¥ããããã®é
åã®ä¸ã§ã¯ãundefined
ã®è¦ç´ ã¨ãã¦è¡¨ç¤ºããã¾ãã
function log(str) {
console.log("Cooked:", str[0]);
console.log("Raw:", str.raw[0]);
}
log`\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