小蘭 發表於 2019-8-12 23:19:00

javascript模板字符串(反引号)

<p class="md-end-block md-p md-focus"><span class="md-plain">模板字面量 是允许嵌入表达式的字符串字面量。</span></p>
<p class="md-end-block md-p"><span class="md-plain">你可以使用<span><strong><span class="md-plain">多行字符串</span></strong><span class="md-plain">和<span><strong><span class="md-plain">字符串插值</span></strong><span class="md-plain">功能。它们在<span><span style="text-decoration: underline"><span class="md-plain">ES2015规范</span></span><span class="md-plain">的先前版本中被称为“模板字符串”。</span></span></span></span></span></span></span></p>
<h1 class="md-end-block md-heading"><span class="md-plain">语法</span></h1>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-string-2">`string text`<br><span>​<br><span><span class="cm-string-2">`string text line 1<br><span> <span class="cm-string-2">string text line 2`<br><span>​<br><span><span class="cm-string-2">`string text ${<span class="cm-variable">expression<span class="cm-string-2">} <span class="cm-string-2">string text`<br><span>​<br><span><span class="cm-variable">tag <span class="cm-string-2">`string text ${<span class="cm-variable">expression<span class="cm-string-2">} <span class="cm-string-2">string text`</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<h1 class="md-end-block md-heading"><span class="md-plain">描述</span></h1>
<p class="md-end-block md-p"><span class="md-plain">模板字符串使用反引号 (<span><code></code><span class="md-plain">) 来代替普通字符串中的用双引号和单引号。模板字符串可以包含特定语法(<span><code>${expression}</code><span class="md-plain">)的占位符。占位符中的表达式和周围的文本会一起传递给一个默认函数,该函数负责将所有的部分连接起来,如果一个模板字符串由表达式开头,则该字符串被称为带标签的模板字符串,该表达式通常是一个函数,它会在模板字符串处理后被调用,在输出最终结果前,你都可以通过该函数来对模板字符串进行操作处理。在模版字符串内使用反引号(`)时,需要在它前面加转义符(\)。</span></span></span></span></span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-string-2">`\`` <span class="cm-operator">=== <span class="cm-string">"`" <span class="cm-comment">// --&gt; true</span></span></span></span></span></pre>
<h2 class="md-end-block md-heading"><span class="md-plain">多行字符串</span></h2>
<p class="md-end-block md-p"><span class="md-plain">在新行中插入的任何字符都是模板字符串中的一部分,使用普通字符串,你可以通过以下的方式获得多行字符串:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-variable">console.<span class="cm-property">log(<span class="cm-string">'string text line 1\n' <span class="cm-operator">+<br><span><span class="cm-string">'string text line 2');<br><span><span class="cm-comment">// "string text line 1<br><span><span class="cm-comment">// string text line 2"</span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">要获得同样效果的多行字符串,只需使用如下代码:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-variable">console.<span class="cm-property">log(<span class="cm-string-2">`string text line 1<br><span><span class="cm-string-2">string text line 2`);<br><span><span class="cm-comment">// "string text line 1<br><span><span class="cm-comment">// string text line 2"</span></span></span></span></span></span></span></span></span></span></pre>
<h2 class="md-end-block md-heading"><span class="md-plain">插入表达式</span></h2>
<p class="md-end-block md-p"><span class="md-plain">在普通字符串中嵌入表达式,必须使用如下语法:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">var <span class="cm-def">a <span class="cm-operator">= <span class="cm-number">5;<br><span><span class="cm-keyword">var <span class="cm-def">b <span class="cm-operator">= <span class="cm-number">10;<br><span><span class="cm-variable">console.<span class="cm-property">log(<span class="cm-string">'Fifteen is ' <span class="cm-operator">+ (<span class="cm-variable">a <span class="cm-operator">+ <span class="cm-variable">b) <span class="cm-operator">+ <span class="cm-string">' and\nnot ' <span class="cm-operator">+ (<span class="cm-number">2 <span class="cm-operator">* <span class="cm-variable">a <span class="cm-operator">+ <span class="cm-variable">b) <span class="cm-operator">+ <span class="cm-string">'.');<br><span><span class="cm-comment">// "Fifteen is 15 and<br><span><span class="cm-comment">// not 20."</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">现在通过模板字符串,我们可以使用一种更优雅的方式来表示:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">var <span class="cm-def">a <span class="cm-operator">= <span class="cm-number">5;<br><span><span class="cm-keyword">var <span class="cm-def">b <span class="cm-operator">= <span class="cm-number">10;<br><span><span class="cm-variable">console.<span class="cm-property">log(<span class="cm-string-2">`Fifteen is ${<span class="cm-variable">a <span class="cm-operator">+ <span class="cm-variable">b<span class="cm-string-2">} <span class="cm-string-2">and<br><span><span class="cm-string-2">not ${<span class="cm-number">2 <span class="cm-operator">* <span class="cm-variable">a <span class="cm-operator">+ <span class="cm-variable">b<span class="cm-string-2">}.`);<br><span><span class="cm-comment">// "Fifteen is 15 and<br><span><span class="cm-comment">// not 20."</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<h2 class="md-end-block md-heading"><span class="md-plain">嵌套模板</span></h2>
<p class="md-end-block md-p"><span class="md-plain">在某些时候,嵌套模板是具有可配置字符串的最简单也是更可读的方法。 在模板中,只需在模板内的占位符 <span><code>${ }</code><span class="md-plain"> 内使用它们,就可以轻松地使用内部反引号。 例如,如果条件 a 是真的,那么返回这个模板化的文字。</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">一个普通字符串例子:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">var <span class="cm-def">classes <span class="cm-operator">= <span class="cm-string">'header'<br><span><span class="cm-variable">classes <span class="cm-operator">+= (<span class="cm-atom">false <span class="cm-operator">?<br><span> &nbsp; <span class="cm-string">'' : <span class="cm-atom">true <span class="cm-operator">?<br><span> &nbsp; &nbsp; <span class="cm-string">' icon-expander' : <span class="cm-string">' icon-collapser');</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">输出:header icon-expander</span></p>
<p class="md-end-block md-p"><span class="md-plain">在ES2015中使用模板文字而没有嵌套:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">var <span class="cm-def">classes <span class="cm-operator">= <span class="cm-string-2">`header ${ <span class="cm-atom">false <span class="cm-operator">? <span class="cm-string">'' :<br><span>(<span class="cm-atom">true <span class="cm-operator">? <span class="cm-string">'icon-expander' : <span class="cm-string">'icon-collapser') <span class="cm-string-2">}`;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">输出:header icon-expander</span></p>
<p class="md-end-block md-p"><span class="md-plain">在ES2015的嵌套模板字面量中:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">var <span class="cm-def">classes <span class="cm-operator">= <span class="cm-string-2">`header ${ <span class="cm-atom">false <span class="cm-operator">? <span class="cm-string">'' :<br><span><span class="cm-string-2">`icon-${<span class="cm-atom">true <span class="cm-operator">? <span class="cm-string">'icon-expander' : <span class="cm-string">'icon-collapser'<span class="cm-string-2">}` <span class="cm-string-2">}`;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">输出:header icon-icon-expander</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">带标签的模板字符串</span></h2>
<p class="md-end-block md-p"><span class="md-plain">更高级的形式的模板字符串是带标签的模板字符串。标签使您可以用函数解析模板字符串。标签函数的第一个参数包含一个字符串值的数组。其余的参数与表达式相关。最后,你的函数可以返回处理好的的字符串(或者它可以返回完全不同的东西<span class="md-softbreak"> <span class="md-plain">, 如下个例子所述)。用于该标签的函数的名称可以被命名为任何名字。</span></span></span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">var <span class="cm-def">person <span class="cm-operator">= <span class="cm-string">'Mike';<br><span><span class="cm-keyword">var <span class="cm-def">age <span class="cm-operator">= <span class="cm-number">28;<br><span>​<br><span><span class="cm-keyword">function <span class="cm-def">myTag(<span class="cm-def">strings, <span class="cm-def">personExp, <span class="cm-def">ageExp) {<br><span>​<br><span> &nbsp;<span class="cm-keyword">var <span class="cm-def">str0 <span class="cm-operator">= <span class="cm-variable-2">strings[<span class="cm-number">0]; <span class="cm-comment">// "that "<br><span> &nbsp;<span class="cm-keyword">var <span class="cm-def">str1 <span class="cm-operator">= <span class="cm-variable-2">strings[<span class="cm-number">1]; <span class="cm-comment">// " is a "<br><span>​<br><span> &nbsp;<span class="cm-comment">// There is technically a string after<br><span> &nbsp;<span class="cm-comment">// the final expression (in our example),<br><span> &nbsp;<span class="cm-comment">// but it is empty (""), so disregard.<br><span> &nbsp;<span class="cm-comment">// var str2 = strings;<br><span>​<br><span> &nbsp;<span class="cm-keyword">var <span class="cm-def">ageStr;<br><span> &nbsp;<span class="cm-keyword">if (<span class="cm-variable-2">ageExp <span class="cm-operator">&gt; <span class="cm-number">99){<br><span> &nbsp; &nbsp;<span class="cm-variable-2">ageStr <span class="cm-operator">= <span class="cm-string">'centenarian';<br><span>} <span class="cm-keyword">else {<br><span> &nbsp; &nbsp;<span class="cm-variable-2">ageStr <span class="cm-operator">= <span class="cm-string">'youngster';<br><span>}<br><span>​<br><span> &nbsp;<span class="cm-keyword">return <span class="cm-variable-2">str0 <span class="cm-operator">+ <span class="cm-variable-2">personExp <span class="cm-operator">+ <span class="cm-variable-2">str1 <span class="cm-operator">+ <span class="cm-variable-2">ageStr;<br><span>​<br><span>}<br><span>​<br><span><span class="cm-keyword">var <span class="cm-def">output <span class="cm-operator">= <span class="cm-variable">myTag<span class="cm-string-2">`that ${ <span class="cm-variable">person <span class="cm-string-2">} <span class="cm-string-2">is a ${ <span class="cm-variable">age <span class="cm-string-2">}`;<br><span>​<br><span><span class="cm-variable">console.<span class="cm-property">log(<span class="cm-variable">output);<br><span><span class="cm-comment">// that Mike is a youngster</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">标签函数并不一定需要返回一个字符串。可以返回其他数据类型,比如数组、json等</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">原始字符串</span></h2>
<p class="md-end-block md-p"><span class="md-plain">在标签函数的第一个参数中,存在一个特殊的属性<span><code>raw</code><span class="md-plain"> ,我们可以通过它来访问模板字符串的原始字符串,而不经过特殊字符的替换。</span></span></span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">function <span class="cm-def">tag(<span class="cm-def">strings) {<br><span> &nbsp;<span class="cm-variable">console.<span class="cm-property">log(<span class="cm-variable-2">strings.<span class="cm-property">raw[<span class="cm-number">0]);<br><span>}<br><span>​<br><span><span class="cm-variable">tag<span class="cm-string-2">`string text line 1 \n string text line 2`;<br><span><span class="cm-comment">// logs "string text line 1 \n string text line 2" </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">另外,使用<span class=" md-link"><span><code>String.raw()</code></span><span class="md-plain"> 方法创建原始字符串和使用默认模板函数和字符串连接创建是一样的。</span></span></span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">var <span class="cm-def">str <span class="cm-operator">= <span class="cm-variable">String.<span class="cm-property">raw<span class="cm-string-2">`Hi\n${<span class="cm-number">2<span class="cm-operator">+<span class="cm-number">3<span class="cm-string-2">}!`;<br><span><span class="cm-comment">// "Hi\n5!"<br><span>​<br><span><span class="cm-variable">str.<span class="cm-property">length;<br><span><span class="cm-comment">// 6<br><span>​<br><span><span class="cm-variable">str.<span class="cm-property">split(<span class="cm-string">'').<span class="cm-property">join(<span class="cm-string">',');<br><span><span class="cm-comment">// "H,i,\,n,5,!"<br><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p md-focus"><span class="md-plain">研究了一下,其实模板字符串中的占位符${expression}相当于分隔符,将模板字符串分割,</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">function <span class="cm-def">tag(<span class="cm-def">strings) {<br><span><span class="cm-variable">console.<span class="cm-property">log(<span class="cm-variable-2">strings.<span class="cm-property">raw[<span class="cm-number">0]);<br><span>​<br><span><span class="cm-variable">console.<span class="cm-property">log(<span class="cm-variable-2">strings.<span class="cm-property">raw[<span class="cm-number">1]);<br><span>​<br><span><span class="cm-variable">console.<span class="cm-property">log(<span class="cm-variable-2">strings.<span class="cm-property">raw[<span class="cm-number">2]);<br><span>}<br><span>​<br><span><span class="cm-variable">tag<span class="cm-string-2">`${<span class="cm-variable">document.<span class="cm-property">cookie<span class="cm-string-2">}`;<br><span><span class="cm-comment">//0,1都是空,3是undefined<br><span><span class="cm-variable">tag<span class="cm-string-2">`aaa${<span class="cm-variable">document.<span class="cm-property">cookie<span class="cm-string-2">}`;<br><span><span class="cm-comment">//0是aaa,1是空,3是undefined<br><span><span class="cm-variable">tag<span class="cm-string-2">`aaa${<span class="cm-variable">document.<span class="cm-property">cookie<span class="cm-string-2">}bbb`;<br><span><span class="cm-comment">//0是aaa,1是bbb,3是undefined<br><span><span class="cm-variable">tag<span class="cm-string-2">`aaa${<span class="cm-variable">document.<span class="cm-property">cookie<span class="cm-string-2">}bbb${<span class="cm-variable">document<span class="cm-string-2">}ccc`;<br><span><span class="cm-comment">//0是aaa,1是bbb,3是ccc</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">从上面例子可以看出占位符${expression}相当于分隔符,将模板字符串分割。</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">带标签的模板字面量及转义序列</span></h2>
<p class="md-end-block md-p"><span class="md-plain">自ES2016起,带标签的模版字面量遵守以下转义序列的规则:</span></p>
<ul class="ul-list" data-mark="-">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">Unicode字符以"\u"开头,例如<span><code>\u00A9</code></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">Unicode码位用"\u{}"表示,例如<span><code>\u{2F804}</code></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">十六进制以"\x"开头,例如<span><code>\xA9</code></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">八进制以""<span class="md-plain">和数字开头,例如<span><code>\251</code></span></span></span></p>
</li>
</ul>
<p>&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain"><img src="https://img2018.cnblogs.com/blog/929455/201908/929455-20190812230210116-1404564850.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">注:八进制好像不管用</span></p>
<p class="md-end-block md-p"><span class="md-plain">参考资料</span></p>
<p class="md-end-block md-p"><span class="md-link">https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/template_strings</span></p><br><br>
来源:https://www.cnblogs.com/alummox/p/11343269.html
頁: [1]
查看完整版本: javascript模板字符串(反引号)