TypedArray
A TypedArray object describes an array-like view of an
underlying binary data buffer.
There is no global property named TypedArray, nor is there a
directly visible TypedArray constructor. Instead, there are a number of
different global properties, whose values are typed array constructors for specific
element types, listed below. On the following pages you will find common properties and
methods that can be used with any typed array containing elements of any type.
Try it
Description
The TypedArray constructor (often referred to as %TypedArray% to indicate its "intrinsicness", since it does not correspond to any global exposed to a JavaScript program) serves as the common superclass of all TypedArray subclasses. Think about %TypedArray% as an "abstract class" providing a common interface of utility methods for all typed array subclasses. This constructor is not directly exposed: there is no global TypedArray property. It is only accessible through Object.getPrototypeOf(Int8Array) and similar.
When creating an instance of a TypedArray subclass (e.g. Int8Array), an array buffer is created internally in memory or, if an ArrayBuffer object is given as constructor argument, that ArrayBuffer is used instead. The buffer address is saved as an internal property of the instance and all the methods of %TypedArray%.prototype will set and get values based on that array buffer address.
TypedArray objects
| Type | Value Range | Size in bytes | Description | Web IDL type | Equivalent C type |
|---|---|---|---|---|---|
Int8Array |
-128 to 127 | 1 | 8-bit two's complement signed integer | byte |
int8_t |
Uint8Array |
0 to 255 | 1 | 8-bit unsigned integer | octet |
uint8_t |
Uint8ClampedArray |
0 to 255 | 1 | 8-bit unsigned integer (clamped) | octet |
uint8_t |
Int16Array |
-32768 to 32767 | 2 | 16-bit two's complement signed integer | short |
int16_t |
Uint16Array |
0 to 65535 | 2 | 16-bit unsigned integer | unsigned short |
uint16_t |
Int32Array |
-2147483648 to 2147483647 | 4 | 32-bit two's complement signed integer | long |
int32_t |
Uint32Array |
0 to 4294967295 | 4 | 32-bit unsigned integer | unsigned long |
uint32_t |
Float32Array |
-3.4E38 to 3.4E38 and 1.2E-38 is the min positive number |
4 | 32-bit IEEE floating point number (7 significant digits e.g., 1.234567) |
unrestricted float |
float |
Float64Array |
-1.8E308 to 1.8E308 and 5E-324 is the min positive number |
8 | 64-bit IEEE floating point number (16 significant digits e.g., 1.23456789012345) |
unrestricted double |
double |
BigInt64Array |
-263 to 263 - 1 | 8 | 64-bit two's complement signed integer | bigint |
int64_t (signed long long) |
BigUint64Array |
0 to 264 - 1 | 8 | 64-bit unsigned integer | bigint |
uint64_t (unsigned long long) |
Behavior when viewing a resizable buffer
When a TypedArray is created as a view of a resizable buffer, resizing the underlying buffer will have different effects on the size of the TypedArray depending on whether the TypedArray is constructed as length-tracking.
If a typed array is created without a specific size by omitting the third parameter or passing undefined, the typed array will become length-tracking, and will automatically resize to fit the underlying buffer as the latter is resized:
js
const buffer = new ArrayBuffer(8, { maxByteLength: 16 });
const float32 = new Float32Array(buffer);
console.log(float32.byteLength); // 8
console.log(float32.length); // 2
buffer.resize(12);
console.log(float32.byteLength); // 12
console.log(float32.length); // 3
If a typed array is created with a specific size using the third length parameter, it won't resize to contain the buffer as the latter is grown:
js
const buffer = new ArrayBuffer(8, { maxByteLength: 16 });
const float32 = new Float32Array(buffer, 0, 2);
console.log(float32.byteLength); // 8
console.log(float32.length); // 2
console.log(float32[0]); // 0, the initial value
buffer.resize(12);
console.log(float32.byteLength); // 8
console.log(float32.length); // 2
console.log(float32[0]); // 0, the initial value
When a buffer is shrunk, the viewing typed array may become out of bounds, in which case the typed array's observed size will decrease to 0. This is the only case where a non-length-tracking typed array's length may change.
js
const buffer = new ArrayBuffer(8, { maxByteLength: 16 });
const float32 = new Float32Array(buffer, 0, 2);
buffer.resize(7);
console.log(float32.byteLength); // 0
console.log(float32.length); // 0
console.log(float32[0]); // undefined
If you then grow the buffer again to bring the typed array back in bounds, the typed array's size will be restored to its original value.
js
buffer.resize(8);
console.log(float32.byteLength); // 8
console.log(float32.length); // 2
console.log(float32[0]); // 0 - back in bounds again!
The same can happen for length-tracking typed arrays as well, if the buffer is shrunk beyond the byteOffset.
js
const buffer = new ArrayBuffer(8, { maxByteLength: 16 });
const float32 = new Float32Array(buffer, 4);
// float32 is length-tracking, but it only extends from the 4th byte
// to the end of the buffer, so if the buffer is resized to be shorter
// than 4 bytes, the typed array will become out of bounds
buffer.resize(3);
console.log(float32.byteLength); // 0
Constructor
This object cannot be instantiated directly — attempting to construct it with new throws a TypeError.
js
new (Object.getPrototypeOf(Int8Array))();
// TypeError: Abstract class TypedArray not directly constructable
Instead, you create an instance of a typed array of a particular type, such as an Int8Array or a BigInt64Array. These objects all have a common syntax for their constructors:
js
new TypedArray()
new TypedArray(length)
new TypedArray(typedArray)
new TypedArray(object)
new TypedArray(buffer)
new TypedArray(buffer, byteOffset)
new TypedArray(buffer, byteOffset, length)
Where TypedArray is a constructor for one of the concrete types.
Parameters
typedArray-
When called with an instance of a
TypedArraysubclass, thetypedArraygets copied into a new typed array. For a non-bigintTypedArrayconstructor, thetypedArrayparameter can only be of one of the non-bigint types (such asInt32Array). Similarly, for a bigintTypedArrayconstructor (BigInt64ArrayorBigUint64Array), thetypedArrayparameter can only be of one of the bigint types. Each value intypedArrayis converted to the corresponding type of the constructor before being copied into the new array. The length of the new typed array will be same as the length of thetypedArrayargument. object-
When called with an object that's not a
TypedArrayinstance, a new typed array is created in the same way as theTypedArray.from()method. lengthOptional-
When called with a non-object, the parameter will be treated as a number specifying the length of the typed array. An internal array buffer is created in memory, of size
lengthmultiplied byBYTES_PER_ELEMENTbytes, filled with zeros. Omitting all parameters is equivalent to using0aslength. buffer,byteOffsetOptional,lengthOptional-
When called with an
ArrayBufferorSharedArrayBufferinstance, and optionally abyteOffsetand alengthargument, a new typed array view is created that views the specified buffer. ThebyteOffset(in bytes) andlength(in number of elements, each occupyingBYTES_PER_ELEMENTbytes) parameters specify the memory range that will be exposed by the typed array view. If both are omitted, all ofbufferis viewed; if onlylengthis omitted, the remainder ofbufferstarting frombyteOffsetis viewed. Iflengthis omitted, the typed array becomes length-tracking.
Exceptions
All TypeArray subclass constructors operate in the same way. They would all throw the following exceptions:
TypeError-
Thrown in one of the following cases:
- A
typedArrayis passed but it is a bigint type while the current constructor is not, or vice versa. - A
typedArrayis passed but the buffer it's viewing is detached, or a detachedbufferis directly passed.
- A
RangeError-
Thrown in one of the following cases:
- The new typed array's length is too large.
- The length of
buffer(if thelengthparameter is not specified) orbyteOffsetis not an integral multiple of the new typed array's element size. byteOffsetis not a valid array index (an integer between 0 and 253 - 1).- When creating a view from a buffer, the bounds are outside the buffer. In other words,
byteOffset + length * TypedArray.BYTES_PER_ELEMENT > buffer.byteLength.
Static properties
These properties are defined on the TypedArray constructor object and are thus shared by all TypedArray subclass constructors.
TypedArray[@@species]-
The constructor function used to create derived objects.
All TypedArray subclasses also have the following static properties:
TypedArray.BYTES_PER_ELEMENT-
Returns a number value of the element size for the different
TypedArrayobjects.
Static methods
These methods are defined on the TypedArray constructor object and are thus shared by all TypedArray subclass constructors.
TypedArray.from()-
Creates a new
TypedArrayfrom an array-like or iterable object. See alsoArray.from(). TypedArray.of()-
Creates a new
TypedArraywith a variable number of arguments. See alsoArray.of().
Instance properties
These properties are defined on TypedArray.prototype and shared by all TypedArray subclass instances.
TypedArray.prototype.buffer-
Returns the
ArrayBufferreferenced by the typed array. TypedArray.prototype.byteLength-
Returns the length (in bytes) of the typed array.
TypedArray.prototype.byteOffset-
Returns the offset (in bytes) of the typed array from the start of its
ArrayBuffer. TypedArray.prototype.constructor-
The constructor function that created the instance object.
TypedArray.prototype.constructoris the hiddenTypedArrayconstructor function, but each typed array subclass also defines its ownconstructorproperty. TypedArray.prototype.length-
Returns the number of elements held in the typed array.
TypedArray.prototype[@@toStringTag]-
The initial value of the
TypedArray.prototype[@@toStringTag]property is a getter that returns the same string as the typed array constructor's name. It returnsundefinedif thethisvalue is not one of the typed array subclasses. This property is used inObject.prototype.toString(). However, becauseTypedArrayalso has its owntoString()method, this property is not used unless you callObject.prototype.toString.call()with a typed array asthisArg.
All TypedArray subclasses also have the following instance properties:
TypedArray.prototype.BYTES_PER_ELEMENT-
Returns a number value of the element size for the different
TypedArrayobjects.
Instance methods
These methods are defined on the TypedArray prototype object and are thus shared by all TypedArray subclass instances.
TypedArray.prototype.at()-
Takes an integer value and returns the item at that index. This method allows for negative integers, which count back from the last item.
TypedArray.prototype.copyWithin()-
Copies a sequence of array elements within the array. See also
Array.prototype.copyWithin(). TypedArray.prototype.entries()-
Returns a new array iterator object that contains the key/value pairs for each index in the array. See also
Array.prototype.entries(). TypedArray.prototype.every()-
Tests whether all elements in the array pass the test provided by a function. See also
Array.prototype.every(). TypedArray.prototype.fill()-
Fills all the elements of an array from a start index to an end index with a static value. See also
Array.prototype.fill(). TypedArray.prototype.filter()-
Creates a new array with all of the elements of this array for which the provided filtering function returns
true. See alsoArray.prototype.filter(). TypedArray.prototype.find()-
Returns the first
elementin the array that satisfies a provided testing function, orundefinedif no appropriate element is found. See alsoArray.prototype.find(). TypedArray.prototype.findIndex()-
Returns the first index value in the array that has an element that satisfies a provided testing function, or
-1if no appropriate element was found. See alsoArray.prototype.findIndex(). TypedArray.prototype.findLast()-
Returns the value of the last element in the array that satisfies a provided testing function, or
undefinedif no appropriate element is found. See alsoArray.prototype.findLast(). TypedArray.prototype.findLastIndex()-
Returns the index of the last element in the array that satisfies a provided testing function, or
-1if no appropriate element was found. See alsoArray.prototype.findLastIndex(). TypedArray.prototype.forEach()-
Calls a function for each element in the array. See also
Array.prototype.forEach(). TypedArray.prototype.includes()-
Determines whether a typed array includes a certain element, returning
trueorfalseas appropriate. See alsoArray.prototype.includes(). TypedArray.prototype.indexOf()-
Returns the first (least) index of an element within the array equal to the specified value, or
-1if none is found. See alsoArray.prototype.indexOf(). TypedArray.prototype.join()-
Joins all elements of an array into a string. See also
Array.prototype.join(). TypedArray.prototype.keys()-
Returns a new array iterator that contains the keys for each index in the array. See also
Array.prototype.keys(). TypedArray.prototype.lastIndexOf()-
Returns the last (greatest) index of an element within the array equal to the specified value, or
-1if none is found. See alsoArray.prototype.lastIndexOf(). TypedArray.prototype.map()-
Creates a new array with the results of calling a provided function on every element in this array. See also
Array.prototype.map(). TypedArray.prototype.reduce()-
Apply a function against an accumulator and each value of the array (from left-to-right) as to reduce it to a single value. See also
Array.prototype.reduce(). TypedArray.prototype.reduceRight()-
Apply a function against an accumulator and each value of the array (from right-to-left) as to reduce it to a single value. See also
Array.prototype.reduceRight(). TypedArray.prototype.reverse()-
Reverses the order of the elements of an array — the first becomes the last, and the last becomes the first. See also
Array.prototype.reverse(). TypedArray.prototype.set()-
Stores multiple values in the typed array, reading input values from a specified array.
TypedArray.prototype.slice()-
Extracts a section of an array and returns a new array. See also
Array.prototype.slice(). TypedArray.prototype.some()-
Returns
trueif at least one element in this array satisfies the provided testing function. See alsoArray.prototype.some(). TypedArray.prototype.sort()-
Sorts the elements of an array in place and returns the array. See also
Array.prototype.sort(). TypedArray.prototype.subarray()-
Returns a new
TypedArrayfrom the given start and end element index. TypedArray.prototype.toLocaleString()-
Returns a localized string representing the array and its elements. See also
Array.prototype.toLocaleString(). TypedArray.prototype.toReversed()-
Returns a new array with the elements in reversed order, without modifying the original array.
TypedArray.prototype.toSorted()-
Returns a new array with the elements sorted in ascending order, without modifying the original array.
TypedArray.prototype.toString()-
Returns a string representing the array and its elements. See also
Array.prototype.toString(). TypedArray.prototype.values()-
Returns a new array iterator object that contains the values for each index in the array. See also
Array.prototype.values(). TypedArray.prototype.with()-
Returns a new array with the element at the given index replaced with the given value, without modifying the original array.
TypedArray.prototype[@@iterator]()-
Returns a new array iterator object that contains the values for each index in the array.
Examples
Property access
You can reference elements in the array using standard array index syntax (that is,
using bracket notation). However, getting or setting indexed properties on typed arrays
will not search in the prototype chain for this property, even when the indices are out
of bound. Indexed properties will consult the ArrayBuffer and will never
look at object properties. You can still use named properties, just like with all
objects.
js
// Setting and getting using standard array syntax
const int16 = new Int16Array(2);
int16[0] = 42;
console.log(int16[0]); // 42
// Indexed properties on prototypes are not consulted (Fx 25)
Int8Array.prototype[20] = "foo";
new Int8Array(32)[20]; // 0
// even when out of bound
Int8Array.prototype[20] = "foo";
new Int8Array(8)[20]; // undefined
// or with negative integers
Int8Array.prototype[-1] = "foo";
new Int8Array(8)[-1]; // undefined
// Named properties are allowed, though (Fx 30)
Int8Array.prototype.foo = "bar";
new Int8Array(32).foo; // "bar"
Cannot be frozen
TypedArrays that aren't empty cannot be frozen, as their
underlying ArrayBuffer could be mutated through another
TypedArray view of the buffer. This would mean that the object
would never genuinely be frozen.
js
const i8 = Int8Array.of(1, 2, 3);
Object.freeze(i8);
// TypeError: Cannot freeze array buffer views with elements
ByteOffset must be aligned
When constructing a TypedArray as a view onto an
ArrayBuffer, the byteOffset argument must be aligned to its
element size; in other words, the offset must be a multiple of
BYTES_PER_ELEMENT.
js
const i32 = new Int32Array(new ArrayBuffer(4), 1);
// RangeError: start offset of Int32Array should be a multiple of 4
js
const i32 = new Int32Array(new ArrayBuffer(4), 0);
ByteLength must be aligned
Like the byteOffset parameter, the byteLength property of an
ArrayBuffer passed to a TypedArray's constructor
must be a multiple of the constructor's BYTES_PER_ELEMENT.
js
const i32 = new Int32Array(new ArrayBuffer(3));
// RangeError: byte length of Int32Array should be a multiple of 4
js
const i32 = new Int32Array(new ArrayBuffer(4));
Specifications
| Specification |
|---|
| ECMAScript Language Specification # sec-typedarray-objects |
Browser compatibility
BCD tables only load in the browser
See also
- Polyfill of typed arrays in
core-js - JavaScript typed arrays
ArrayBufferDataView- TextDecoder — Helper that decode strings from numerical data