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
|
---
title: Symbol.isConcatSpreadable
slug: Web/JavaScript/Reference/Global_Objects/Symbol/isConcatSpreadable
tags:
- JavaScript
- Symbol
translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/isConcatSpreadable
---
<div>{{JSRef}}</div>
<p>内置的<strong><code>Symbol.isConcatSpreadable</code></strong><code>符号用于配置某对象作为</code>{{jsxref("Array.prototype.concat()")}}方法的参数时是否展开其数组元素。</p>
<div>{{EmbedInteractiveExample("pages/js/symbol-isconcatspreadable.html")}}</div>
<h2 id="描述">描述</h2>
<p><code>@@isConcatSpreadable</code> 符号 (<code>Symbol.isConcatSpreadable</code>) 可以直接定义为对象属性或继承而来,它是布尔类型。它可以控制数组或类似数组(array-like)的对象的行为:</p>
<ul>
<li>对于数组对象,默认情况下,用于concat时,会按数组元素展开然后进行连接(数组元素作为新数组的元素)。重置<code>Symbol.isConcatSpreadable</code>可以改变默认行为。</li>
<li>对于类似数组的对象,用于concat时,该对象整体作为新数组的元素,重置<code>Symbol.isConcatSpreadable</code>可改变默认行为。</li>
</ul>
<p>{{js_property_attributes(0,0,0)}}</p>
<h2 id="示例">示例</h2>
<h3 id="数组">数组</h3>
<p>默认情况下,{{jsxref("Array.prototype.concat()")}} 展开其元素连接到结果中:</p>
<pre class="brush: js">var alpha = ['a', 'b', 'c'],
numeric = [1, 2, 3];
var alphaNumeric = alpha.concat(numeric);
console.log(alphaNumeric); // 结果: ['a', 'b', 'c', 1, 2, 3]
</pre>
<p>设置<code>Symbol.isConcatSpreadable</code>为<code>false</code>:</p>
<pre class="brush: js">var alpha = ['a', 'b', 'c'],
numeric = [1, 2, 3];
numeric[Symbol.isConcatSpreadable] = false;
var alphaNumeric = alpha.concat(numeric);
console.log(alphaNumeric); // 结果: ['a', 'b', 'c', [1, 2, 3] ]
</pre>
<h3 id="Array-like_对象">Array-like 对象</h3>
<p>对于类数组 (array-like)对象,默认不展开。期望展开其元素用于连接,需要设置 <code>Symbol.isConcatSpreadable</code> 为true:</p>
<pre class="brush: js">var x = [1, 2, 3];
var fakeArray = {
[Symbol.isConcatSpreadable]: true,
length: 2,
0: "hello",
1: "world"
}
x.concat(fakeArray); // [1, 2, 3, "hello", "world"]
</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('ES6', '#sec-symbol.isconcatspreadable', 'Symbol.isconcatspreadable')}}</td>
<td>{{Spec2('ES6')}}</td>
<td>Initial definition.</td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-symbol.isconcatspreadable', 'Symbol.isconcatspreadable')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td>No change.</td>
</tr>
</tbody>
</table>
<h2 id="浏览器兼容性">浏览器兼容性</h2>
<p>{{Compat("javascript.builtins.Symbol.isConcatSpreadable")}}</p>
<h2 id="参考">参考</h2>
<ul>
<li>{{jsxref("Array.prototype.concat()")}}</li>
</ul>
|