语法高亮,滚动条美化,设置页面调整

This commit is contained in:
fofolee
2019-04-19 02:41:09 +08:00
parent 1e8f76c000
commit 359d29ee0b
1590 changed files with 12328 additions and 11441 deletions

View File

@@ -2,7 +2,7 @@
<div> </div>
<p>模板字面量 是允许嵌入表达式的字符串字面量。你可以使用多行字符串和字符串插值功能。它们在ES2015规范的先前版本中被称为“模板字符串”。</p>
<h2 id="语法" style="font-size: 2.14285714285714rem;">语法</h2>
<pre class="syntaxbox">`string text`
<pre><code class="language-javascript">`string text`
`string text line 1
string text line 2`
@@ -10,60 +10,60 @@
`string text ${expression} string text`
tag `string text ${expression} string text`
</pre>
</code></pre>
<h2 id="描述" style="font-size: 2.14285714285714rem;">描述</h2>
<p>模板字符串使用反引号 (` `) 来代替普通字符串中的用双引号和单引号。模板字符串可以包含特定语法(<code style="font-style: normal;">${expression}</code>)的占位符。占位符中的表达式和周围的文本会一起传递给一个默认函数,该函数负责将所有的部分连接起来,如果一个模板字符串由表达式开头,则该字符串被称为带标签的模板字符串,该表达式通常是一个函数,它会在模板字符串处理后被调用,在输出最终结果前,你都可以通过该函数来对模板字符串进行操作处理。在模版字符串内使用反引号(`)时,需要在它前面加转义符(\)。</p>
<pre class="brush: js">`\`` === "`" // --&gt; true</pre>
<pre><code class="language-javascript">`\`` === "`" // --&gt; true</code></pre>
<h3 id="多行字符串">多行字符串</h3>
<p>在新行中插入的任何字符都是模板字符串中的一部分,使用普通字符串,你可以通过以下的方式获得多行字符串:</p>
<pre class="brush: js">console.log('string text line 1\n' +
<pre><code class="language-javascript">console.log('string text line 1\n' +
'string text line 2');
// "string text line 1
// string text line 2"</pre>
// string text line 2"</code></pre>
<p>要获得同样效果的多行字符串,只需使用如下代码:</p>
<pre class="brush: js">console.log(`string text line 1
<pre><code class="language-javascript">console.log(`string text line 1
string text line 2`);
// "string text line 1
// string text line 2"</pre>
// string text line 2"</code></pre>
<h3 id="插入表达式">插入表达式</h3>
<p>在普通字符串中嵌入表达式,必须使用如下语法:</p>
<p> </p>
<pre class="brush: js">var a = 5;
<pre><code class="language-javascript">var a = 5;
var b = 10;
console.log('Fifteen is ' + (a + b) + ' and\nnot ' + (2 * a + b) + '.');
// "Fifteen is 15 and
// not 20."</pre>
// not 20."</code></pre>
<p> </p>
<p>现在通过模板字符串,我们可以使用一种更优雅的方式来表示:</p>
<p> </p>
<pre class="brush: js">var a = 5;
<pre><code class="language-javascript">var a = 5;
var b = 10;
console.log(`Fifteen is ${a + b} and
not ${2 * a + b}.`);
// "Fifteen is 15 and
// not 20."</pre>
// not 20."</code></pre>
<p> </p>
<h3 id="嵌套模板">嵌套模板</h3>
<p>在某些时候,嵌套模板是具有可配置字符串的最简单也是更可读的方法。 在模板中,只需在模板内的占位符 <code>${ }</code> 内使用它们,就可以轻松地使用内部反引号。 例如,如果条件 a 是真的,那么返回这个模板化的文字。</p>
<p>ES5:</p>
<pre class="brush: js">var classes = 'header'
<pre><code class="language-javascript">var classes = 'header'
classes += (isLargeScreen() ?
'' : item.isCollapsed ?
' icon-expander' : ' icon-collapser');</pre>
' icon-expander' : ' icon-collapser');</code></pre>
<p>在ES2015中使用模板文字而没有嵌套</p>
<pre class="brush: js">const classes = `header ${ isLargeScreen() ? '' :
<pre><code class="language-javascript">const classes = `header ${ isLargeScreen() ? '' :
(item.isCollapsed ? 'icon-expander' : 'icon-collapser') }`;
</pre>
</code></pre>
<p> </p>
<p>在ES2015的嵌套模板字面量中</p>
<p> </p>
<pre class="brush: js">const classes = `header ${ isLargeScreen() ? '' :
`icon-${item.isCollapsed ? 'expander' : 'collapser'}` }`;</pre>
<pre><code class="language-javascript">const classes = `header ${ isLargeScreen() ? '' :
`icon-${item.isCollapsed ? 'expander' : 'collapser'}` }`;</code></pre>
<p> </p>
<p> </p>
<h3 id="带标签的模板字符串">带标签的模板字符串</h3>
<p>更高级的形式的模板字符串是带标签的模板字符串。标签使您可以用函数解析模板字符串。标签函数的第一个参数包含一个字符串值的数组。其余的参数与表达式相关。最后,你的函数可以返回处理好的的字符串(或者它可以返回完全不同的东西 , 如下个例子所述)。用于该标签的函数的名称可以被命名为任何名字。</p>
<pre class="brush: js">var person = 'Mike';
<pre><code class="language-javascript">var person = 'Mike';
var age = 28;
function myTag(strings, personExp, ageExp) {
@@ -90,9 +90,9 @@ function myTag(strings, personExp, ageExp) {
var output = myTag`that ${ person } is a ${ age }`;
console.log(output);
// that Mike is a youngster</pre>
// that Mike is a youngster</code></pre>
<p class="brush: js">正如下面例子所展示的,标签函数并不一定需要返回一个字符串。</p>
<pre class="brush: js">function template(strings, ...keys) {
<pre><code class="language-javascript">function template(strings, ...keys) {
return (function(...values) {
var dict = values[values.length - 1] || {};
var result = [strings[0]];
@@ -107,18 +107,18 @@ console.log(output);
var t1Closure = template`${0}${1}${0}!`;
t1Closure('Y', 'A'); // "YAY!"
var t2Closure = template`${0} ${'foo'}!`;
t2Closure('Hello', {foo: 'World'}); // "Hello World!"</pre>
t2Closure('Hello', {foo: 'World'}); // "Hello World!"</code></pre>
<h3 id="原始字符串">原始字符串</h3>
<p>在标签函数的第一个参数中,存在一个特殊的属性<code>raw</code> ,我们可以通过它来访问模板字符串的原始字符串,而不经过特殊字符的替换。</p>
<pre class="brush: js">function tag(strings) {
<pre><code class="language-javascript">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'</pre>
// including the two characters '\' and 'n'</code></pre>
<p>另外,使用<a href="Reference/Global_Objects/String/raw" title="String.raw() 是一个模板字符串的标签函数,它的作用类似于 Python 中的字符串前缀 r 和 C# 中的字符串前缀 @,是用来获取一个模板字符串的原始字面量值的。"><code>String.raw()</code></a> 方法创建原始字符串和使用默认模板函数和字符串连接创建是一样的。</p>
<pre class="brush: js line-numbers language-js"><code class="language-js"><span class="keyword token">var</span> str <span class="operator token">=</span> String<span class="punctuation token">.</span>raw<span class="template-string token"><span class="string token">`Hi\n</span><span class="interpolation token"><span class="interpolation-punctuation punctuation token">${</span><span class="number token">2</span><span class="operator token">+</span><span class="number token">3</span><span class="interpolation-punctuation punctuation token">}</span></span><span class="string token">!`</span></span><span class="punctuation token">;</span>
<pre><code class="language-javascript"><code class="language-js"><span class="keyword token">var</span> str <span class="operator token">=</span> String<span class="punctuation token">.</span>raw<span class="template-string token"><span class="string token">`Hi\n</span><span class="interpolation token"><span class="interpolation-punctuation punctuation token">${</span><span class="number token">2</span><span class="operator token">+</span><span class="number token">3</span><span class="interpolation-punctuation punctuation token">}</span></span><span class="string token">!`</span></span><span class="punctuation token">;</span>
<span class="comment token">// "Hi\n5!"</span>
str<span class="punctuation token">.</span>length<span class="punctuation token">;</span>
@@ -126,7 +126,7 @@ str<span class="punctuation token">.</span>length<span class="punctuation token"
str<span class="punctuation token">.</span><span class="function token">split</span><span class="punctuation token">(</span><span class="string token">''</span><span class="punctuation token">)</span><span class="punctuation token">.</span><span class="function token">join</span><span class="punctuation token">(</span><span class="string token">','</span><span class="punctuation token">)</span><span class="punctuation token">;</span>
<span class="comment token">// "H,i,\,n,5,!"</span></code>
</pre>
</code></pre>
<h3 id="带标签的模版字面量及转义序列">带标签的模版字面量及转义序列</h3>
<p>自ES2016起带标签的模版字面量遵守以下转义序列的规则</p>
<ul>
@@ -136,22 +136,22 @@ str<span class="punctuation token">.</span><span class="function token">split</s
<li>八进制以"\"和数字开头,例如<code>\251</code></li>
</ul>
<p>这表示类似下面这种带标签的模版是有问题的因为对于每一个ECMAScript语法解析器都会去查找有效的转义序列但是只能得到这是一个形式错误的语法</p>
<pre class="brush: js">latex`\unicode`
<pre><code class="language-javascript">latex`\unicode`
// 在较老的ECMAScript版本中报错ES2016及更早
// SyntaxError: malformed Unicode character escape sequence
</pre>
</code></pre>
<h4 id="ES2018关于非法转义序列的修订">ES2018关于非法转义序列的修订</h4>
<p>带标签的模版字符串应该允许嵌套支持常见转义序列的语言(例如<a class="external" href="https://en.wikipedia.org/wiki/Domain-specific_language" rel="noopener">DSLs</a><a class="external" href="https://en.wikipedia.org/wiki/LaTeX" rel="noopener">LaTeX</a>。ECMAScript提议<a class="external" href="https://tc39.github.io/proposal-template-literal-revision/" rel="noopener">模版字面量修订</a>(第4阶段将要集成到ECMAScript 2018标准) 移除对ECMAScript在带标签的模版字符串中转义序列的语法限制。</p>
<p>不过,非法转义序列在"cooked"当中仍然会体现出来。它们将以 <a href="Reference/Global_Objects/undefined" title="undefined是全局对象的一个属性。也就是说它是全局作用域的一个变量。undefined的最初值就是原始数据类型undefined。"><code>undefined</code></a> 元素的形式存在于"cooked"之中:</p>
<pre class="brush: js">function latex(str) {
<pre><code class="language-javascript">function latex(str) {
return { "cooked": str[0], "raw": str.raw[0] }
}
latex`\unicode`
// { cooked: undefined, raw: "\\unicode" }</pre>
// { cooked: undefined, raw: "\\unicode" }</code></pre>
<p>值得注意的是,这一转义序列限制只对带标签的模板字面量移除,而不包括不带标签的模板字面量:</p>
<pre class="brush: js example-bad">let bad = `bad escape sequence: \unicode`;</pre>
<pre><code class="language-js example-bad">let bad = `bad escape sequence: \unicode`;</code></pre>
<h2 id="规范" style="font-size: 2.14285714285714rem;">规范</h2>
<table class="standard-table">
<tbody>