类型数组

基线 广泛可用

此功能已得到很好的建立,可在许多设备和浏览器版本中使用。从那时起,它就可以跨浏览器使用了 2015年7月.

A类类型数组对象描述了潜在的二进制数据缓冲区.没有名为的全局属性类型数组,也没有直接可见类型数组构造函数。相反,有许多不同的全局属性,其值是特定类型的数组构造函数元素类型,如下所示。在以下页面中,您将找到常见属性和可以与包含任何类型元素的任何类型数组一起使用的方法。

试试看

描述

这个类型数组构造函数(通常称为%类型数组%表示其“内在性”,因为它不对应于任何向JavaScript程序公开的全局)类型数组子类。考虑%类型数组%作为一个“抽象类”,为所有类型化数组子类提供实用程序方法的通用接口。此构造函数没有直接公开:没有全局类型数组财产。只能通过以下方式访问Object.getPrototypeOf(Int8Array)和类似的。

创建的实例时类型数组子类(例如。Int8阵列),数组缓冲区是在内存中内部创建的,如果阵列缓冲区对象作为构造函数参数给定,即阵列缓冲区而是使用。缓冲区地址保存为实例的内部属性和%TypedArray%.原型将基于该数组缓冲区地址设置和获取值。

TypedArray对象

类型 数值范围 大小(字节) Web IDL类型
Int8阵列 -128至127 1 字节
Uint8阵列 0到255 1 八位字节
Uint8夹紧阵列 0到255 1 八位字节
Int16阵列 -32768至32767 2 短的
Uint16阵列 0至65535 2 无符号短
Int32阵列 -2147483648至21474836547 4 长的
Uint32阵列 0至4294967295 4 无符号长
浮点16数组 -6550465504 2 不适用
Float32数组 -3.4电子383.4电子38 4 无限制浮动
Float64数组 -1.8电子3081.8电子308 8 无限制双人
BigInt64阵列 -263至263- 1 8 bigint公司
BigUint64阵列 0到264- 1 8 bigint公司

值编码和规范化

所有类型化数组都在阵列缓冲区s、 在这里,您可以观察每个元素的确切字节表示,因此数字如何以二进制格式编码非常重要。

  • 无符号整数数组(Uint8阵列,Uint16阵列,Uint32阵列、和BigUint64阵列)将数字直接存储为二进制。
  • 带符号整数数组(Int8阵列,Int16阵列,Int32阵列、和BigInt64阵列)使用存储号码二的补码.
  • 浮点数组(浮点16数组,Float32数组、和Float64数组)使用存储号码IEEE 754标准浮点格式。这个编号reference提供了有关确切格式的更多信息。JavaScript数字默认使用双精度浮点格式,这与Float64数组.Float32数组尾数使用23(而不是52)位,指数使用8(而不是11)位。浮点16数组尾数使用10位,指数使用5位。请注意,规范要求NaN公司值使用相同的位编码,但确切的位模式取决于实现。
  • Uint8夹紧阵列是一个特例。它以二进制形式存储数字Uint8阵列是的,但当您存储范围外的数字时夹具通过数学值将数字设置为0到255的范围,而不是截断最高有效位。

所有类型化数组,除了Int8阵列,Uint8阵列、和Uint8夹紧阵列使用多个字节存储每个元素。这些字节可以从最重要到最不重要(大-中)或从最不重要到最重要(小-中)排序。请参见持久性了解更多说明。类型化数组始终使用平台的本机字节顺序。如果要在从缓冲区写入和读取时指定结束顺序,则应使用数据视图而不是。

当写入这些类型化数组时,超出可表示范围的值将被规范化。

  • 所有整数数组(除Uint8夹紧阵列)使用固定宽度数字转换,它首先截断数字的小数部分,然后取最低位。
  • Uint8夹紧阵列首先,将数字限制在0到255的范围内(大于255的值将变为255,小于0的值将变成0)。那就好了(代替地板)结果精确到最接近的整数,具有半到偶数;也就是说,如果数字正好位于两个整数之间,则将四舍五入为最接近的偶数。例如,0.5成为0,1.5成为2、和2.5成为2.
  • 浮点16数组Float32数组执行“四舍五入到偶数”将64位浮点数字转换为32位和16位。这与数学公式()数学f16round().

查看可调整大小的缓冲区时的行为

类型数组创建为的视图可调整大小的缓冲区,调整基础缓冲区的大小将对类型数组取决于类型数组构造为纵向跟踪。

如果通过省略第三个参数或传递未定义,类型化数组将变为纵向跟踪,并将自动调整大小以适应基础缓冲器随着后者的大小调整:

js型
const buffer=新的ArrayBuffer(8,{maxByteLength:16});const float32=新的Float32Array(缓冲区);console.log(float32.byteLength);//8console.log(float32.length);//2缓冲区。调整大小(12);console.log(float32.byteLength);//12console.log(float32.length);//

如果使用第三个长度参数,它不会调整大小以包含缓冲器随着后者的生长:

js型
const buffer=新的ArrayBuffer(8,{maxByteLength:16});const float32=新的Float32Array(缓冲区,0,2);console.log(float32.byteLength);//8console.log(float32.length);//2控制台.log(float32[0]);//0,初始值缓冲区。调整大小(12);console.log(float32.byteLength);//8console.log(float32.length);//2控制台.log(float32[0]);//0,初始值

缓冲器如果缩小,则查看类型化数组可能会越界,在这种情况下,类型化数组的观察大小将减少到0。这是唯一一种非长度跟踪类型数组的长度可能更改的情况。

js型
const buffer=新的ArrayBuffer(8,{maxByteLength:16});const float32=新的Float32Array(缓冲区,0,2);缓冲区。调整大小(7);console.log(float32.byteLength);//0console.log(float32.length);//0控制台.log(float32[0]);//未定义

如果你把缓冲器同样,为了使类型化数组返回边界,类型化数组的大小将恢复为其原始值。

js型
缓冲区。调整大小(8);console.log(float32.byteLength);//8console.log(float32.length);//2控制台.log(float32[0]);//0-再次回到界内!

如果缓冲区缩小到超过字节偏移量.

js型
const buffer=新的ArrayBuffer(8,{maxByteLength:16});const float32=新的Float32Array(缓冲区,4);//float32是长度跟踪的,但它只从第4个字节扩展//到缓冲区的末尾,因此如果缓冲区的大小调整为较短//超过4个字节,则类型化数组将超出界限缓冲区。调整大小(3);console.log(float32.byteLength);//0

施工单位

无法直接实例化此对象-试图用新的抛出一个类型错误.

js型
new(Object.getPrototypeOf(Int8Array))();//TypeError:抽象类TypedArray不可直接构造

相反,您可以创建特定类型的类型化数组的实例,例如Int8阵列或aBigInt64阵列。这些对象的构造函数都有一个通用语法:

js型
新建TypedArray()新TypedArray(长度)新建TypedArray(TypedArray)新建TypedArray(对象)新TypedArray(缓冲区)新TypedArray(缓冲区,字节偏移)新TypedArray(缓冲区、字节偏移量、长度)

在哪里?类型数组是其中一个具体类型的构造函数。

注:全部类型数组子类的构造函数只能用新的。尝试在没有新的抛出一个类型错误.

参数

typedArray(类型数组)

使用的实例调用时类型数组子类typedArray(类型数组)复制到新的类型化数组中。对于非-bigint公司 类型数组构造函数typedArray(类型数组)参数只能是非-bigint公司类型(例如Int32阵列). 类似地,对于bigint公司 类型数组建造师(BigInt64阵列BigUint64阵列)typedArray(类型数组)参数只能是bigint公司类型。中的每个值typedArray(类型数组)在复制到新数组之前,转换为相应的构造函数类型。新类型数组的长度将与typedArray(类型数组)参数。

对象

当使用非类型数组实例中创建一个新的类型化数组的方法与TypedArray.from()方法。

长度 可选

使用非对象调用时,参数将被视为指定类型化数组长度的数字。在内存中创建一个大小为的内部数组缓冲区长度乘以字节_性能_元素字节,用零填充。省略所有参数等同于使用0作为长度.

缓冲器,字节偏移量 可选,长度 可选

当使用阵列缓冲区SharedArrayBuffer(共享阵列缓冲区)实例,也可以选择字节偏移量和a长度参数时,将创建一个新的类型化数组视图,用于查看指定的缓冲区。这个字节偏移量(以字节为单位)和长度(元素数量,每个元素占用字节_性能_元素字节)参数指定类型化数组视图将公开的内存范围。如果两者都省略,则所有缓冲器已查看;只要长度省略,剩余的缓冲器从开始字节偏移量已查看。如果长度则类型化数组变为纵向跟踪.

例外情况

全部类型数组子类构造函数的操作方式相同。它们都会抛出以下异常:

类型错误

出现以下情况之一:

  • A类typedArray(类型数组)已通过,但它是bigint公司类型,而当前构造函数不是,反之亦然。
  • A类typedArray(类型数组)传递,但其查看的缓冲区已分离,或已分离缓冲器直接传递。
范围错误

出现以下情况之一:

  • 新类型数组的长度太大。
  • 的长度缓冲器(如果长度未指定参数)或字节偏移量不是新类型数组元素大小的整数倍。
  • 字节偏移量不是有效的数组索引(介于0和2之间的整数53- 1).
  • 从缓冲区创建视图时,边界位于缓冲区之外。换句话说,字节偏移量+长度*类型数组。BYTES_PER_ELEMENT>缓冲区.byteLength.

静态特性

这些属性在类型数组构造函数对象,因此由所有类型数组子类构造函数。

TypedArray[Symbol.species]

用于创建派生对象的构造函数。

全部类型数组子类还具有以下静态属性:

TypedArray。字节_性能_元素

返回不同元素大小的数值类型数组物体。

静态方法

这些方法在类型数组构造函数对象,因此由所有类型数组子类构造函数。

TypedArray.from()

创建新的类型数组从类数组或可迭代对象。另请参见数组.from().

TypedArray.of()

创建新的类型数组参数数量可变。另请参见数组.of().

实例属性

这些属性定义于类型阵列原型并由所有人共享类型数组子类实例。

类型数组原型缓冲区

返回阵列缓冲区被类型化数组引用。

类型数组原型字节长度

返回类型化数组的长度(以字节为单位)。

类型数组原型字节偏移

返回类型化数组从其开始的偏移量(以字节为单位)阵列缓冲区.

类型数组原型构造函数

创建实例对象的构造函数。类型数组原型构造函数是隐藏的类型数组构造函数,但每个类型化数组子类也定义了自己的建造师属性。

类型阵列.原型.长度

返回类型化数组中包含的元素数。

TypedArray.prototype[Symbol.toStringTag]

的初始值TypedArray.prototype[Symbol.toStringTag]属性是一个getter,它返回与类型化数组构造函数名称相同的字符串。它会返回未定义如果值不是类型化数组子类之一。此属性用于Object.prototype.toString()然而,因为类型数组也有自己的toString()方法,除非调用Object.prototype.toString.call()类型化数组为这个Arg.

全部类型数组子类还具有以下实例属性:

TypedArray.prototype类型。字节_性能_元素

返回不同类型数组物体。

实例方法

这些方法在类型数组prototype对象,因此由所有人共享类型数组子类实例。

类型数组.protype.at()

获取一个整数值并返回该索引处的项。此方法允许从最后一项倒数的负整数。

TypedArray.prototype.copyWithin()

复制数组中的数组元素序列。另请参见Array.prototype.copyWithin().

TypedArray.prototype.entries()

返回一个新数组迭代器对象,该对象包含数组中每个索引的键/值对。另请参见Array.prototype.entries().

TypedArray.prototype.every()

测试数组中的所有元素是否通过函数提供的测试。另请参见Array.prototype.every().

TypedArray.prototype.fill()

使用静态值填充从开始索引到结束索引的数组的所有元素。另请参见Array.prototype.fill().

TypedArray.prototype.filter()

使用提供的筛选函数返回的此数组的所有元素创建一个新数组真的。另请参阅Array.prototype.filter().

TypedArray.prototype.find()

返回第一个要素在满足所提供测试功能的数组中,或未定义如果没有找到合适的元素。另请参见Array.prototype.find()数组原型查找().

TypedArray.prototype.findIndex()

返回数组中具有满足所提供测试函数的元素的第一个索引值,或-1如果没有找到合适的元素。另请参见数组.prototype.findIndex().

TypedArray.prototype.findLast()

返回满足所提供测试函数的数组中最后一个元素的值,或未定义如果没有找到合适的元素。另请参见Array.prototype.findLast().

TypedArray.prototype.findLastIndex()

返回数组中满足所提供测试函数的最后一个元素的索引,或-1如果没有找到合适的元素。另请参见数组.prototype.findLastIndex().

TypedArray.prototype.forEach()

为数组中的每个元素调用函数。另请参见数组.原型.forEach().

TypedArray.prototype.includes()

确定类型化数组是否包括某个元素,返回真的视情况而定。另请参见Array.prototype.includes().

TypedArray.prototype.indexOf()

返回数组中等于指定值的元素的第一个(最小)索引,或-1如果没有找到。另请参见Array.prototype.indexOf().

TypedArray.prototype.join()

将数组的所有元素连接到字符串中。另请参阅Array.prototype.join().

TypedArray.prototype.keys()

返回一个新的数组迭代器,其中包含数组中每个索引的键。另请参见Array.prototype.keys().

TypedArray.prototype.lastIndexOf()

返回数组中元素的最后(最大)索引,该索引等于指定值,或-1如果没有找到。另请参见数组.prototype.lastIndexOf().

TypedArray.prototype.map()

创建一个新数组,其结果是在此数组中的每个元素上调用提供的函数。另请参见Array.prototype.map().

TypedArray.prototype.reduce()

对累加器和数组的每个值(从左到右)应用函数,以将其减少为单个值。另请参见Array.prototype.reduce().

TypedArray.prototype.reduceRight()

对累加器和数组的每个值(从右到左)应用函数,以将其减少为单个值。另请参见Array.prototype.reducedRight()数组原型减少右侧().

TypedArray.prototype.reverse()

颠倒数组元素的顺序-第一个元素变成最后一个,最后一个元素变成第一个。另请参见Array.prototype.reverse().

TypedArray.prototype.set()

在类型化数组中存储多个值,从指定数组中读取输入值。

TypedArray.prototype.slice()

提取数组的一部分并返回新数组。另请参见Array.prototype.slice().

TypedArray.prototype.some()

退换商品真的如果该阵列中的至少一个元件满足所提供的测试功能。另请参见Array.prototype.some().

TypedArray.prototype.sort()

就地对数组的元素进行排序并返回数组。另请参见Array.prototype.sort().

TypedArray.prototype.subarray()

返回一个新类型数组从给定的开始和结束元素索引。

TypedArray.prototype.toLocaleString()类型数组.原型.toLocaleString()

返回表示数组及其元素的本地化字符串。另请参见Array.prototype.toLocaleString().

TypedArray.prototype.toReversed()

返回元素顺序相反的新数组,而不修改原始数组。

TypedArray.prototype.toSorted()

返回元素按升序排序的新数组,而不修改原始数组。

TypedArray.prototype.toString()

返回表示数组及其元素的字符串。另请参见Array.prototype.toString().

TypedArray.prototype.values()

返回一个新数组迭代器对象,该对象包含数组中每个索引的值。另请参见Array.prototype.values().

TypedArray.prototype.with()

返回一个新数组,其中给定索引处的元素替换为给定值,而不修改原始数组。

TypedArray.prototype[Symbol.iterator]()

返回一个新数组迭代器对象,该对象包含数组中每个索引的值。

示例

财产访问权

可以使用标准数组索引语法(即,使用括号表示法)。但是,获取或设置类型化数组的索引属性将不会在原型链中搜索此属性,即使索引不存在绑定的。索引属性将参考阵列缓冲区而且永远不会查看对象属性。您仍然可以使用命名属性,就像所有物体。

js型
//使用标准数组语法进行设置和获取const int16=新的Int16Array(2);整数16[0]=42;console.log(int16[0]);//42//未参考原型上的索引属性(Fx 25)Int8Array.prototype[20]=“foo”;新Int8Array(32)[20];//0//即使出界Int8Array.prototype[20]=“foo”;新Int8Array(8)[20];//未定义//或使用负整数Int8Array.prototype[-1]=“foo”;新Int8Array(8)[-1];//未定义//但允许命名属性(Fx 30)Int8Array.prototype.foo=“bar”;新Int8Array(32).foo;//“酒吧”

无法冻结

类型数组不能冻结非空的,因为它们的潜在的阵列缓冲区可以通过另一个变异类型数组缓冲区视图。这意味着物体永远不会真正被冻结。

js型
const i8=(1,2,3)的Int8Array;对象冻结(i8);//TypeError:无法冻结包含元素的数组缓冲区视图

ByteOffset必须对齐

构造类型数组作为对阵列缓冲区,的字节偏移量参数必须与其对齐单元尺寸;换句话说,偏移量必须是字节_性能_元素.

js型
const i32=新的Int32Array(新的ArrayBuffer(4),1);//RangeError:Int32Array的开始偏移量应为4的倍数
js型
const i32=新的Int32Array(新的ArrayBuffer(4),0);

ByteLength必须对齐

就像字节偏移量参数字节长度的属性阵列缓冲区传递给类型数组的构造函数必须是构造函数的倍数字节_性能_元素.

js型
const i32=新的Int32Array(新的ArrayBuffer(3));//RangeError:Int32Array的字节长度应为4的倍数
js型
const i32=新的Int32Array(新的ArrayBuffer(4));

规格

规范
ECMAScript语言规范
#sec-typedarray-对象

浏览器兼容性

BCD表仅在浏览器中加载

另请参见