このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。
Array[Symbol.species]
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2020年1月.
Array[Symbol.species] 静的アクセサープロパティは、配列のメソッドからの返値を構築するのに使われたコンストラクターを返します。
警告:[Symbol.species] が存在することで、任意のコードを実行でき、セキュリティの脆弱性を生み出す可能性があります。また、ある種の最適化が非常に難しくなります。エンジンの実装者はこの機能を除去するかどうかを調査しています。使用可能であれば、この機能に頼ることは避けてください。toReversed() のような現代の配列メソッドは[Symbol.species] を使用せず、常に新しいArray 基本クラスのインスタンスを返します。
In this article
構文
Array[Symbol.species]返値
get [Symbol.species] が呼び出されたコンストラクター (this) の値です。この返値は、新しい配列を作成する配列メソッドの返値を作成するために使用されます。
解説
[Symbol.species] アクセサープロパティは、Array オブジェクトの既定のコンストラクターを返します。サブクラスのコンストラクターはコンストラクターに代入することで、これをオーバーライドすることができます。既定の実装は基本的に次の通りです。
// 説明のための仮説的な実装class Array { static get [Symbol.species]() { return this; }}この多相的な実装のために、派生したサブクラスの[Symbol.species] も既定値でコンストラクター自身を返すことになります。
class SubArray extends Array {}SubArray[Symbol.species] === SubArray; // true既存の配列を変更せずに新しい配列インスタンスを返す配列メソッド(例えばfilter() やmap())を呼び出す場合、配列のconstructor[Symbol.species] にアクセスすることになります。返されたコンストラクターは、配列メソッドの返値を作成するために使用されます。これにより、配列メソッドが配列とは無関係のオブジェクトを返すようにすることが技術的に可能になります。
class NotAnArray { constructor(length) { this.length = length; }}const arr = [0, 1, 2];arr.constructor = { [Symbol.species]: NotAnArray };arr.map((i) => i); // NotAnArray { '0': 0, '1': 1, '2': 2, length: 3 }arr.filter((i) => i); // NotAnArray { '0': 1, '1': 2, length: 0 }arr.concat([1, 2]); // NotAnArray { '0': 0, '1': 1, '2': 2, '3': 1, '4': 2, length: 5 }例
>通常のオブジェクトの species
[Symbol.species] プロパティは、Array オブジェクトの既定のコンストラクター関数であるArray コンストラクターを返します。
Array[Symbol.species]; // [Function: Array]派生オブジェクトの spicies
派生コレクションオブジェクト(たとえば、独自の配列であるMyArray)では、MyArray の species はMyArray コンストラクターです。しかし、派生クラスのメソッドで、親であるArray オブジェクトを返すためにこれをオーバーライドしたいかもしれません。
class MyArray extends Array { // MyArray species を親である Array コンストラクターにオーバーライド。 static get [Symbol.species]() { return Array; }}仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-get-array-%symbol.species%> |