ES6
提出了一种新型的字符串文字,使用`
反引号作为分隔符。这些文字确实允许嵌入基本的字符串插值表达式,然后对其进行自动分析和评估。
let actor = {name: 'RajiniKanth', age: 68};
let oldWayStr = "<p>My name is " + actor.name + ",</p>\n" +
"<p>I am " + actor.age + " old</p>\n";
let newWayHtmlStr =
`<p>My name is ${actor.name},</p>
<p>I am ${actor.age} old</p>`;
console.log(oldWayStr);
console.log(newWayHtmlStr);
如您所见,我们在一系列字符周围使用了..``,这些字符被解释为字符串文字,但是该形式的任何表达式都将${..}
立即进行内联解析和求值。
插值字符串文字的一个非常不错的好处是允许它们分成多行:
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 );
内插表达式
任何有效的表达式都可以出现${..}
在插值字符串的内部lit‐ eral
,包括函数调用,内联函数表达式调用,甚至其他interpo‐ lated string literals
!
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 );
在这里,当将who变量与"s"
字符串(而不是who +“ s”组合在一起)时,内部的$ {who} s``内插字符串文字为我们提供了更好的便利。另外要注意的是插值字符串文字正好lexically scoped
出现dynamically scoped
在其中,而不是以任何方式出现
function foo(str) {
var name = "foo";
console.log( str );
}
function bar() {
var name = "bar";
foo( `Hello from ${name}!` );
}
var name = "global";
bar();
template literal
通过减少烦恼,使用HTML绝对可以提高可读性。
普通的旧方法:
'<div class="' + className + '">' +
'<p>' + content + '</p>' +
'<a href="' + link + '">Let\'s go</a>'
'</div>';
与ES6
:
`<div class="${className}">
<p>${content}</p>
<a href="${link}">Let's go</a>
</div>`
- 您的字符串可以跨越多行。
- 您不必转义引号字符。
- 您可以避免类似“>”的分组
- 您不必使用加号运算符。
标记模板文字
我们还可以标记template
字符串,当标记了字符串时template
,literals
和替换将传递给函数,该函数返回结果值。
function myTaggedLiteral(strings) {
console.log(strings);
}
myTaggedLiteral`test`;
function myTaggedLiteral(strings,value,value2) {
console.log(strings,value, value2);
}
let someText = 'Neat';
myTaggedLiteral`test ${someText} ${2 + 3}`;
我们可以使用 spread
这里运算符来传递多个值。第一个参数(我们称为字符串)是所有纯字符串(任何内插表达式之间的内容)的数组。
然后,我们使用()将所有后续参数收集到称为值的数组中... gather/rest operator
,尽管您当然可以像上面那样在字符串参数之后将它们保留为单独的命名参数(value1, value2 etc)
。
function myTaggedLiteral(strings,...values) {
console.log(strings);
console.log(values);
}
let someText = 'Neat';
myTaggedLiteral`test ${someText} ${2 + 3}`;
将argument(s)
收集到我们的价值观数组是在字符串字面发现已经评价插值表达式的结果。tagged string literal
在评估插值之后但在编译最终的字符串值之前,A就像一个处理步骤,使您可以更好地控制从文字生成字符串。让我们来看一个创建的示例re-usable templates
。
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);
原始字符串
我们的标签功能接收称为第一个参数我们strings
,这是一个array
。但是其中还包含其他数据:所有字符串的原始未处理版本。您可以使用.raw
属性访问这些原始字符串值,如下所示:
function showraw(strings, ...values) {
console.log( strings );
console.log( strings.raw );
}
showraw`Hello\nWorld`;
如您所见,raw
字符串的版本保留转义的\ n序列,而字符串的已处理版本将其视为未转义的真实换行符。 ES6
带有一个内置函数,可用作字符串文字标签: String.raw(..)
。它只是通过的原始版本strings
:
console.log( `Hello\nWorld` );
console.log( String.raw`Hello\nWorld` );