TypedArray[Symbol.species]

Baseline 已广泛支持

此特性已非常成熟,可在多种设备和浏览器版本上使用。自 ⁨2016 年 9 月⁩以来,它已在各大浏览器中可用。

TypedArray[Symbol.species] 静态访问器属性返回用于构造类型化数组方法的返回值的构造函数。

警告: [Symbol.species] 的存在允许执行任意代码,并可能产生安全漏洞。它还会使某些优化变得更加困难。引擎实现者正在 调查是否要移除此功能。如果可能,请避免依赖它。

语法

js
TypedArray[Symbol.species]

返回值

调用 get [Symbol.species] 时构造函数 (this) 的值。返回值用于构造创建新类型化数组的类型化数组方法的返回值。

描述

[Symbol.species] 访问器属性返回 类型化数组 对象的默认构造函数。子类构造函数可以重写它来更改构造函数分配。默认实现基本上是

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

由于这种多态实现,派生子类的 [Symbol.species] 默认情况下也将返回构造函数本身。

js
class SubTypedArray extends Int8Array {}
SubTypedArray[Symbol.species] === SubTypedArray; // true

在调用不修改现有数组但返回新数组实例的类型化数组方法(例如,filter()map())时,将访问数组的 constructor[Symbol.species]。返回的构造函数将用于构造类型化数组方法的返回值。

然而,与 Array[Symbol.species] 不同,在使用 [Symbol.species] 创建新的类型化数组时,语言会确保新创建的数组是一个合适的类型化数组,并且具有与原始数组相同的元素类型 — 例如,您不能从 Float64Array 创建 BigInt64Array,或从 BigInt 数组创建非 BigInt 数组。这样做会引发 TypeError

js
class BadArray extends Int8Array {
  static get [Symbol.species]() {
    return Array;
  }
}
new BadArray(1).map(() => 0); // TypeError: Method %TypedArray%.prototype.map called on incompatible receiver [object Array]

class BadArray2 extends Int8Array {
  static get [Symbol.species]() {
    return BigInt64Array;
  }
}
new BadArray2(1).map(() => 0n); // TypeError: TypedArray.prototype.map constructed typed array of different content type from |this|

注意: 由于 SpiderMonkey 和 V8 中的一个错误,元素类型匹配未被检查。只有 Safari 会在第二个示例中引发 TypeError

示例

普通对象中的 species

对于任何给定的 类型化数组 构造函数,[Symbol.species] 属性返回默认构造函数,该函数本身就是其中一个类型化数组构造函数。

js
Int8Array[Symbol.species]; // function Int8Array()
Uint8Array[Symbol.species]; // function Uint8Array()
Float32Array[Symbol.species]; // function Float32Array()

派生对象中的 species

在自定义 TypedArray 子类的实例中,例如 MyTypedArrayMyTypedArray 的 species 是 MyTypedArray 构造函数。但是,您可能希望覆盖它,以便在派生类方法中返回父 类型化数组 对象。

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

规范

规范
ECMAScript® 2026 语言规范
# sec-get-%typedarray%-%symbol.species%

浏览器兼容性

另见