aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/javascript/reference/global_objects/string/raw/index.html
blob: 89c4d568d5a967c302794580217781ac004d2f44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
---
title: String.raw()
slug: Web/JavaScript/Reference/Global_Objects/String/raw
tags:
  - JavaScript
  - Method
  - Reference
  - String
  - 参考
  - 字符串
  - 方法
translation_of: Web/JavaScript/Reference/Global_Objects/String/raw
---
<div>{{JSRef()}}</div>

<p><strong>String.raw()</strong> 是一个<a href="/zh-CN/docs/Web/JavaScript/Reference/template_strings">模板字符串</a>的标签函数,它的作用类似于 Python 中的字符串前缀 <code>r</code> 和 C# 中的字符串前缀 <code>@</code>(还是有点区别的,详见隔壁 Chromium 那边的<a href="https://bugs.chromium.org/p/v8/issues/detail?id=5016">这个 issue</a>),是用来获取一个模板字符串的原始字符串的,比如说,占位符(例如 <code>${foo}</code>)会被处理为它所代表的其他字符串,而转义字符(例如 <code>\n</code>)不会。</p>

<h2 id="语法">语法</h2>

<pre class="syntaxbox"><code>String.raw(<var>callSite</var>, <var>...substitutions</var>)

String.raw`templateString`
</code></pre>

<h3 id="参数">参数</h3>

<dl>
 <dt><code>callSite</code></dt>
 <dd>一个模板字符串的“调用点对象”。类似<code>{ raw: ['foo', 'bar', 'baz'] }</code></dd>
 <dt><code>...substitutions</code></dt>
 <dd>任意个可选的参数,表示任意个内插表达式对应的值。</dd>
 <dt><code>templateString</code></dt>
 <dd>模板字符串,可包含占位符(<code>${...}</code>)。</dd>
</dl>

<h3 id="返回值">返回值</h3>

<p>给定模板字符串的原始字符串。</p>

<h3 id="异常">异常</h3>

<dl>
 <dt><code>{{jsxref("TypeError")}}</code></dt>
 <dd>如果第一个参数没有传入一个格式正确的对象,则会抛出 <code>TypeError</code> 异常。</dd>
</dl>

<h2 id="描述">描述</h2>

<p>在大多数情况下, <code>String.raw()</code>是用来处理模版字符串的. 不要被上面复杂的参数要求吓到,因为像所有的 <a href="/en-US/docs/Web/JavaScript/Reference/template_strings#Tagged_template_literals">tag functions</a>一样,你通常不需要把它看成一个普通函数,你只需要把它放在模板字符串前面就可以了,而不是在它后面加个括号和一堆参数来调用它,引擎会替你去调用它。</p>

<p><code>String.raw()</code> 是唯一一个内置的模板字符串标签函数,因为它太常用了。不过它并没有什么特殊能力,你自己也可以实现一个和它功能一模一样的标签函数。</p>

<h2 id="示例">示例</h2>

<h3 id="使用_String.raw">使用 <code>String.raw()</code></h3>

<pre class="brush: js">String.raw`Hi\n${2+3}!`;
// 'Hi\n5!',Hi 后面的字符不是换行符,\ 和 n 是两个不同的字符

String.raw `Hi\u000A!`;
// "Hi\u000A!",同上,这里得到的会是 \、u、0、0、0、A 6个字符,
// 任何类型的转义形式都会失效,保留原样输出,不信你试试.length

let name = "Bob";
String.raw `Hi\n${name}!`;
// "Hi\nBob!",内插表达式还可以正常运行


// 正常情况下,你也许不需要将 String.raw() 当作函数调用。
// 但是为了模拟 `t${0}e${1}s${2}t` 你可以这样做:
String.raw({ raw: 'test' }, 0, 1, 2); // 't0e1s2t'
// 注意这个测试, 传入一个 string, 和一个类似数组的对象
// 下面这个函数和 `foo${2 + 3}bar${'Java' + 'Script'}baz` 是相等的.
String.raw({
  raw: ['foo', 'bar', 'baz']
}, 2 + 3, 'Java' + 'Script'); // 'foo5barJavaScriptbaz'
</pre>

<h2 id="规范">规范</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">规范</th>
   <th scope="col">状态</th>
   <th scope="col">备注</th>
  </tr>
  <tr>
   <td>{{SpecName('ES2015', '#sec-string.raw', 'String.raw')}}</td>
   <td>{{Spec2('ES2015')}}</td>
   <td>Initial definition.</td>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-string.raw', 'String.raw')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td></td>
  </tr>
 </tbody>
</table>

<h2 id="浏览器兼容性">浏览器兼容性</h2>

<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p>

<p>{{Compat("javascript.builtins.String.raw")}}</p>

<h2 id="参见">参见</h2>

<ul>
 <li><a href="/zh-CN/docs/Web/JavaScript/Reference/template_strings">模板字符串</a></li>
 <li>{{jsxref("String")}}</li>
 <li><a href="/zh-CN/docs/Web/JavaScript/Reference/Lexical_grammar">JavaScript 词法</a></li>
</ul>