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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
---
title: 'RegExp.prototype[@@split]()'
slug: Web/JavaScript/Reference/Global_Objects/RegExp/@@split
translation_of: Web/JavaScript/Reference/Global_Objects/RegExp/@@split
---
<div>{{JSRef}}</div>
<p><strong><code>[@@split]()</code></strong> 方法切割 {{jsxref("String")}} 对象为一个其子字符串的数组 。</p>
<h2 id="语法">语法</h2>
<pre class="syntaxbox"><var>regexp</var>[Symbol.split](str[, <var>limit</var>])</pre>
<h3 id="参数">参数</h3>
<dl>
<dt><code>str</code></dt>
<dd>切割操作的目标字符串</dd>
<dt><code>limit</code></dt>
<dd>
<p>可选。一个为了限制切割数量的特定整数。 <code>[@@split]()</code> 防范仍会切割每个匹配正则模式的匹配项,直到切割数量达到该限制数,除非提前切割完字符串。</p>
</dd>
</dl>
<h3 id="返回值">返回值</h3>
<p>包含其子字符串的{{jsxref("Array")}} 。</p>
<h2 id="描述">描述</h2>
<p>如果切割器是一个{{jsxref("RegExp")}}对象,这个方法就将在 {{jsxref("String.prototype.split()")}} 的内部调用。例如,下面的两个方法返回相同结果。</p>
<pre class="brush: js">'a-b-c'.split(/-/);
/-/[Symbol.split]('a-b-c');</pre>
<p>这个方法为自定义 <code>RegExp</code> 子类中的匹配行为而存在。</p>
<p>如果str参数不是一个{{jsxref("RegExp")}} 对象, {{jsxref("String.prototype.split()")}} 就不会调用该方法,也不会创建一个 {{jsxref("RegExp")}} 对象。示例</p>
<h3 id="直接调用">直接调用</h3>
<p>这个方法的使用方式和 {{jsxref("String.prototype.split()")}} 相同,不同之处是 <code>this</code> 和参数顺序。</p>
<pre class="brush: js">var re = /-/g;
var str = '2016-01-02';
var result = re[Symbol.split](str);
console.log(result); // ["2016", "01", "02"]
</pre>
<h3 id="在子类中使用_split">在子类中使用 <code>@@split</code></h3>
<p>{{jsxref("RegExp")}} 的子类可以覆写 <code>[@@split]()</code>方法来修改默认行为。</p>
<pre class="brush: js">class MyRegExp extends RegExp {
[Symbol.split](str, limit) {
var result = RegExp.prototype[Symbol.split].call(this, str, limit);
return result.map(x => "(" + x + ")");
}
}
var re = new MyRegExp('-');
var str = '2016-01-02';
var result = str.split(re); // String.prototype.split calls re[@@split].
console.log(result); // ["(2016)", "(01)", "(02)"]
</pre>
<h2 id="规范">规范</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Specification</th>
<th scope="col">Status</th>
<th scope="col">Comment</th>
</tr>
<tr>
<td>{{SpecName('ES6', '#sec-regexp.prototype-@@split', 'RegExp.prototype[@@split]')}}</td>
<td>{{Spec2('ES6')}}</td>
<td>初始定义</td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-regexp.prototype-@@split', 'RegExp.prototype[@@split]')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td> </td>
</tr>
</tbody>
</table>
<h2 id="浏览器兼容性">浏览器兼容性</h2>
<div>{{CompatibilityTable}}</div>
<div id="compat-desktop">
<table class="compat-table">
<tbody>
<tr>
<th>Feature</th>
<th>Chrome</th>
<th>Firefox (Gecko)</th>
<th>Internet Explorer</th>
<th>Opera</th>
<th>Safari</th>
</tr>
<tr>
<td>Basic support</td>
<td>{{CompatUnknown}}</td>
<td>{{CompatGeckoDesktop(49)}}</td>
<td>{{CompatUnknown}}</td>
<td>{{CompatUnknown}}</td>
<td>{{CompatUnknown}}</td>
</tr>
</tbody>
</table>
</div>
<div id="compat-mobile">
<table class="compat-table">
<tbody>
<tr>
<th>Feature</th>
<th>Android</th>
<th>Chrome for Android</th>
<th>Firefox Mobile (Gecko)</th>
<th>IE Mobile</th>
<th>Opera Mobile</th>
<th>Safari Mobile</th>
</tr>
<tr>
<td>Basic support</td>
<td>{{CompatUnknown}}</td>
<td>{{CompatUnknown}}</td>
<td>{{CompatGeckoMobile(49)}}</td>
<td>{{CompatUnknown}}</td>
<td>{{CompatUnknown}}</td>
<td>{{CompatUnknown}}</td>
</tr>
</tbody>
</table>
</div>
<h2 id="另见">另见</h2>
<ul>
<li>{{jsxref("String.prototype.split()")}}</li>
<li>{{jsxref("RegExp.prototype.@@match()", "RegExp.prototype[@@match]()")}}</li>
<li>{{jsxref("RegExp.prototype.@@replace()", "RegExp.prototype[@@replace]()")}}</li>
<li>{{jsxref("RegExp.prototype.@@search()", "RegExp.prototype[@@search]()")}}</li>
<li>{{jsxref("RegExp.prototype.exec()")}}</li>
<li>{{jsxref("RegExp.prototype.test()")}}</li>
</ul>
|