cae*_*ang 229 javascript backticks template-strings single-quotes backquote
在JavaScript中,反引用†似乎与单引号相同.例如,我可以使用反引号来定义这样的字符串:
var s = `abc`;
Run Code Online (Sandbox Code Playgroud)
有什么方法可以使反引号的行为实际上与单引号的行为不同?
†请注意,在程序员中,"反引号"是更常被称为重音符号的名称.程序员有时也使用替代名称 "反引号"和"反向".此外,在Stack Overflow和其他地方,"反击"的其他常见拼写是"后退"和"后退".
try*_*lly 253
这是一个名为模板文字的功能.
它们在ECMAScript 2015规范的先前版本中被称为"模板字符串".
Firefox 34,Chrome 41和Edge 12及更高版本支持模板文字,但Internet Explorer不支持.
模板文字可用于表示多行字符串,并可使用"插值"来插入变量:
var a = 123, str = `---
a is: ${a}
---`;
console.log(str);
Run Code Online (Sandbox Code Playgroud)
输出:
---
a is: 123
---
Run Code Online (Sandbox Code Playgroud)
更重要的是,它们不仅可以包含变量名称,还可以包含任何Javascript表达式:
var a = 3, b = 3.1415;
console.log(`PI is nearly ${Math.max(a, b)}`);
Run Code Online (Sandbox Code Playgroud)
Tha*_*var 139
ECMAScript 6提供了一种新类型的字符串文字,使用反向标记作为分隔符.这些文字确实允许嵌入基本字符串插值表达式,然后自动解析和评估它们.
let person = {name: 'RajiniKanth', age: 68, greeting: 'Thalaivaaaa!' };
let usualHtmlStr = "<p>My name is " + person.name + ",</p>\n" +
"<p>I am " + person.age + " old</p>\n" +
"<strong>\"" + person.greeting + "\" is what I usually say</strong>";
let newHtmlStr =
`<p>My name is ${person.name},</p>
<p>I am ${person.age} old</p>
<p>"${person.greeting}" is what I usually say</strong>`;
console.log(usualHtmlStr);
console.log(newHtmlStr);
Run Code Online (Sandbox Code Playgroud)
如您所见,我们使用`
了一系列字符,这些字符被解释为字符串文字,但表格的任何表达式都会${..}
立即进行内联解析和评估.
插值字符串文字的一个非常好的好处是允许它们分成多行:
var Actor = {"name": "RajiniKanth"};
var text =
`Now is the time for all good men like ${Actor.name}
to come to the aid of their
country!`;
console.log(text);
// Now is the time for all good men
// to come to the aid of their
// country!
Run Code Online (Sandbox Code Playgroud)
插值表达式
允许任何有效表达式出现${..}
在插值字符串文字中,包括函数调用,内联函数表达式调用,甚至其他插值字符串文字!
function upper(s) {
return s.toUpperCase();
}
var who = "reader"
var text =
`A very ${upper("warm")} welcome
to all of you ${upper(`${who}s`)}!`;
console.log(text);
// A very WARM welcome
// to all of you READERS!
Run Code Online (Sandbox Code Playgroud)
在这里,内部`${who}s`
插值字符串文字在将who变量与"s"
字符串组合时对我们来说是一个更好的方便,而不是who + "s"
.另外要保留一个注释是一个内插的字符串文字只是在它出现的词汇范围,而不是以任何方式动态范围
function foo(str) {
var name = "foo";
console.log(str);
}
function bar() {
var name = "bar";
foo(`Hello from ${name}!`);
}
var name = "global";
bar(); // "Hello from bar!"
Run Code Online (Sandbox Code Playgroud)
通过减少烦恼,使用HTML的模板文字肯定更具可读性.
简单的旧方式:
'<div class="' + className + '">' +
'<p>' + content + '</p>' +
'<a href="' + link + '">Let\'s go</a>'
'</div>';
Run Code Online (Sandbox Code Playgroud)
使用ECMAScript 6:
`<div class="${className}">
<p>${content}</p>
<a href="${link}">Let's go</a>
</div>`
Run Code Online (Sandbox Code Playgroud)
标记模板文字
我们还可以标记模板字符串,当标记模板字符串时,将文字和替换传递给返回结果值的函数.
function myTaggedLiteral(strings) {
console.log(strings);
}
myTaggedLiteral`test`; //["test"]
function myTaggedLiteral(strings, value, value2) {
console.log(strings, value, value2);
}
let someText = 'Neat';
myTaggedLiteral`test ${someText} ${2 + 3}`;
//["test", ""]
// "Neat"
// 5
Run Code Online (Sandbox Code Playgroud)
我们可以在这里使用spread运算符来传递多个值.第一个参数 - 我们称之为字符串 - 是所有普通字符串的数组(任何插值表达式之间的东西).
然后我们使用the将所有后续参数收集到一个名为values的数组中... gather/rest operator
,尽管你当然可以像在上面那样将它们作为单独的命名参数放在strings参数之后(value1, value2, etc.)
.
function myTaggedLiteral(strings, ...values) {
console.log(strings);
console.log(values);
}
let someText = 'Neat';
myTaggedLiteral`test ${someText} ${2 + 3}`;
//["test", ""]
// "Neat"
// 5
Run Code Online (Sandbox Code Playgroud)
收集到我们的values数组中的参数是在字符串文字中找到的已经评估的插值表达式的结果.标记的字符串文字类似于评估插值后的处理步骤,但在编译最终字符串值之前,允许您更多地控制从文字生成字符串.我们来看一个创建可重用模板的示例.
const Actor = {
name: "RajiniKanth",
store: "Landmark"
}
const ActorTemplate = templater`<article>
<h3>${'name'} is a Actor</h3>
<p>You can find his movies at ${'store'}.</p>
</article>`;
function templater(strings, ...keys) {
return function(data) {
let temp = strings.slice();
keys.forEach((key, i) => {
temp[i] = temp[i] + data[key];
});
return temp.join('');
}
};
const myTemplate = ActorTemplate(Actor);
console.log(myTemplate);
Run Code Online (Sandbox Code Playgroud)
原始字符串
我们的标记函数接收第一个参数,我们称之为字符串,它是一个数组.但是还有一些数据包括:所有字符串的原始未处理版本.您可以使用.raw
属性访问这些原始字符串值,如下所示:
function showraw(strings, ...values) {
console.log(strings);
console.log(strings.raw);
}
showraw`Hello\nWorld`;
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,字符串的原始版本保留了转义\n
序列,而字符串的处理版本将其视为未转义的真实换行符.ECMAScript 6附带了一个内置函数,可以用作字符串文字标记:String.raw(..)
.它只是传递字符串的原始版本:
console.log(`Hello\nWorld`);
/* "Hello
World" */
console.log(String.raw`Hello\nWorld`);
// "Hello\nWorld"
Run Code Online (Sandbox Code Playgroud)
Roh*_*dal 20
Backticks(`
)用于定义模板文字.模板文字是ES6中的一项新功能,可以更轻松地处理字符串.
特征:
注意:我们可以在backticks()中轻松使用单引号('
)和双"
引号(`
).
例:
var nameStr = `I'm "Rohit" Jindal`;
Run Code Online (Sandbox Code Playgroud)
为了插入变量或表达式,我们可以使用${expression}
表示法.
var name = 'Rohit Jindal';
var text = `My name is ${name}`;
console.log(text); // My name is Rohit Jindal
Run Code Online (Sandbox Code Playgroud)
多行字符串意味着您不再需要再使用\n
新行.
例:
const name = 'Rohit';
console.log(`Hello ${name}!
How are you?`);
Run Code Online (Sandbox Code Playgroud)
输出:
Hello Rohit!
How are you?
Run Code Online (Sandbox Code Playgroud)
Ank*_*mar 19
除了字符串插值,您还可以使用反引号调用函数。
var sayHello = function () {
console.log('Hello', arguments);
}
// To call this function using ``
sayHello`some args`; // Check console for the output
// Or
sayHello`
some args
`;
Run Code Online (Sandbox Code Playgroud)
检查样式组件。他们大量使用它。
小智 13
反引号包含模板文字,以前称为模板字符串.模板文字是字符串文字,允许嵌入表达式和字符串插值功能.
模板文字具有嵌入在占位符中的表达式,由美元符号和表达式周围的大括号表示,即${expression}
.占位符/表达式传递给函数.默认函数只是连接字符串.
要逃避反击,请在其前面加一个反斜杠:
`\`` === '`'; => true
Run Code Online (Sandbox Code Playgroud)
使用反引号更容易编写多行字符串:
console.log(`string text line 1
string text line 2`);
Run Code Online (Sandbox Code Playgroud)
要么
console.log(`Fifteen is ${a + b} and
not ${2 * a + b}.`);
Run Code Online (Sandbox Code Playgroud)
与香草JavaScript:
console.log('string text line 1\n' +
'string text line 2');
Run Code Online (Sandbox Code Playgroud)
要么
console.log('Fifteen is ' + (a + b) + ' and\nnot ' + (2 * a + b) + '.');
Run Code Online (Sandbox Code Playgroud)
逃脱序列:
\u
例如,Unicode转义开始于\u00A9
\u{}
例如,Unicode代码点转义表示\u{2F804}
\x
例如,十六进制转义开始于\xA9
\
和(a)数字开始\251
JavaScript中的反引号是ECMAScript 6 // ECMAScript 2015中引入的一项功能,用于创建简单的动态字符串。此ECMAScript 6功能也称为模板字符串文字。与普通字符串相比,它具有以下优点:
''
或声明""
)不允许换行。${myVariable}
语法轻松地将变量值插入到字符串中。const name = 'Willem';
const age = 26;
const story = `
My name is: ${name}
And I'm: ${age} years old
`;
console.log(story);
Run Code Online (Sandbox Code Playgroud)
所有主要浏览器供应商(Internet Explorer除外)都固有地支持模板字符串文字。因此,在生产代码中使用它非常节省。浏览器兼容性的更详细列表可以在此处找到。
好的部分是我们可以直接进行基本数学运算:
let nuts = 7
more.innerHTML = `
<h2>You collected ${nuts} nuts so far!
<hr>
Double it, get ${nuts + nuts} nuts!!
`
Run Code Online (Sandbox Code Playgroud)
<div id="more"></div>
Run Code Online (Sandbox Code Playgroud)
它在工厂函数中变得非常有用:
function nuts(it){
return `
You have ${it} nuts! <br>
Cosinus of your nuts: ${Math.cos(it)} <br>
Triple nuts: ${3 * it} <br>
Your nuts encoded in BASE64:<br> ${btoa(it)}
`
}
nut.oninput = (function(){
out.innerHTML = nuts(nut.value)
})
Run Code Online (Sandbox Code Playgroud)
<h3>NUTS CALCULATOR
<input type="number" id="nut">
<div id="out"></div>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
119758 次 |
最近记录: |