Array[Symbol.species]
Baseline Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с сентября 2015 года.
Статический аксессор **Array[Symbol.species]** возвращает конструктор, используемый для создания результатов из методов массива.
Предупреждение: Наличие [Symbol.species] позволяет выполнять произвольный код и может создать уязвимости безопасности. Это также значительно затрудняет некоторые оптимизации. Разработчики движков исследуют возможность удаления этой функции. По возможности избегайте ее использования. Современные методы массива, такие как toReversed(), не используют [Symbol.species] и всегда возвращают новый экземпляр базового класса Array.
Синтаксис
Array[Symbol.species]
Возвращаемое значение
Значение конструктора (this), у которого был вызван get [Symbol.species]. Возвращаемое значение используется для создания результатов из методов массива, которые создают новые массивы.
Описание
Аксессор [Symbol.species] возвращает конструктор по умолчанию для объектов Array. Конструкторы подклассов могут переопределять его для изменения назначения конструктора. Реализация по умолчанию в основном выглядит так:
// Hypothetical underlying implementation for illustration
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]
Species в производных объектах
В экземпляре пользовательского подкласса Array, такого как MyArray, вид MyArray — это конструктор MyArray. Однако вы можете захотеть переопределить это, чтобы возвращать родительские объекты Array в методах вашего производного класса:
class MyArray extends Array {
// Overwrite MyArray species to the parent Array constructor
static get [Symbol.species]() {
return Array;
}
}
Спецификации
Совместимость с браузерами
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
@@species |
51 |
79 |
48 |
38 |
10 |
51 |
48 |
41 |
10 |
5.0 |
51 |
10 |
1.0.0 |
1.0 |
6.5.0 |
См. также
- Polyfill
Array[Symbol.species]и поддержка[Symbol.species]во всех затронутых методахArrayвcore-js - Руководство по индексированным коллекциям
ArraySymbol.species
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Symbol.species