Symbol.isConcatSpreadable
Symbol.isConcatSpreadable は、Array.prototype.concat() メソッドを使用してオブジェクトを配列の要素に平坦化する場合の設定として使用されます。
試してみましょう
説明
@@isConcatSpreadable シンボル(Symbol.isConcatSpreadable)は直接、または継承されたプロパティとして定義でき、その値は boolean です。これは、配列や配列状のオブジェクトの振る舞いを制御します:
- 配列オブジェクトにとって、既定の動作は要素の展開(平坦化)です。
Symbol.isConcatSpreadableはこれらの場合に平坦化を避けます。 - 配列状のオブジェクトにとって、既定の動作は展開や平坦化を行いません。
Symbol.isConcatSpreadableはこれらの場合に平坦化を強制します。
Symbol.isConcatSpreadable のプロパティ属性 |
|
|---|---|
| 書込可能 | 不可 |
| 列挙可能 | 不可 |
| 設定可能 | 不可 |
例
配列
既定で、Array.prototype.concat() は配列を次の結果のように展開(平坦化)します:
js
let alpha = ['a', 'b', 'c'],
let numeric = [1, 2, 3]
let alphaNumeric = alpha.concat(numeric)
console.log(alphaNumeric) // Result: ['a', 'b', 'c', 1, 2, 3]
Symbol.isConcatSpreadable を false に設定した場合、既定の動作を使用できなくなります:
js
let alpha = ['a', 'b', 'c'],
let numeric = [1, 2, 3]
numeric[Symbol.isConcatSpreadable] = false
let alphaNumeric = alpha.concat(numeric)
console.log(alphaNumeric) // Result: ['a', 'b', 'c', [1, 2, 3] ]
配列状のオブジェクト
配列状のオブジェクトは、既定で展開しません。Symbol.isConcatSpreadable 平坦化した配列を取得するには、true に設定する必要があります:
js
let x = [1, 2, 3]
let fakeArray = {
[Symbol.isConcatSpreadable]: true,
length: 2,
0: 'hello',
1: 'world'
}
x.concat(fakeArray) // [1, 2, 3, "hello", "world"]
メモ: length プロパティは、追加するオブジェクトプロパティの数を制御するために使用されます。上記の例では、length:2 は 2 つのプロパティを追加する必要があることを示しています。
仕様
| Specification |
|---|
| ECMAScript Language Specification # sec-symbol.isconcatspreadable |
ブラウザー実装状況
BCD tables only load in the browser