Array[Symbol.species]

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流瀏覽器均已支援。

Array[Symbol.species] 靜態訪問器屬性返回用於構造陣列方法返回值的建構函式。

警告:[Symbol.species] 的存在允許執行任意程式碼,並可能產生安全漏洞。它還使得某些最佳化變得更加困難。引擎實現者正在研究是否移除此功能。如果可能,請避免依賴它。現代陣列方法,例如 toReversed(),不使用 [Symbol.species],而是始終返回一個新的 Array 基類例項。

語法

js
Array[Symbol.species]

返回值

呼叫 get [Symbol.species] 時的建構函式 (this) 的值。返回值用於構造建立新陣列的陣列方法的返回值。

描述

[Symbol.species] 訪問器屬性返回 Array 物件的預設建構函式。子類建構函式可以重寫它以更改建構函式分配。預設實現基本上是

js
// Hypothetical underlying implementation for illustration
class Array {
  static get [Symbol.species]() {
    return this;
  }
}

由於這種多型實現,派生子類的 [Symbol.species] 預設情況下也將返回建構函式本身。

js
class SubArray extends Array {}
SubArray[Symbol.species] === SubArray; // true

呼叫那些不修改現有陣列但返回新陣列例項的陣列方法時(例如,filter()map()),將訪問陣列的 constructor[Symbol.species]。返回的建構函式將用於構造陣列方法的返回值。這使得在技術上可能使陣列方法返回與陣列無關的物件。

js
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] 屬性返回預設建構函式,即 ArrayArray 建構函式。

js
Array[Symbol.species]; // [Function: Array]

派生物件中的 species

在自定義 Array 子類(例如 MyArray)的例項中,MyArray 的 species 是 MyArray 建構函式。但是,您可能希望重寫它,以便在派生類方法中返回父 Array 物件。

js
class MyArray extends Array {
  // Overwrite MyArray species to the parent Array constructor
  static get [Symbol.species]() {
    return Array;
  }
}

規範

規範
ECMAScript® 2026 語言規範
# sec-get-array-%symbol.species%

瀏覽器相容性

另見