Spec-Zone.ru › JavaScript

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;
  }
}

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-get-array-%symbol.species%

Совместимость с браузерами

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
  • Руководство по индексированным коллекциям
  • Array
  • Symbol.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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API