TypedArray.from()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
TypedArray.from()
静态方法从类数组对象或可迭代对象创建一个新的类型化数组。此方法与 Array.from()
几乎相同。
尝试一下
const uint16 = Int16Array.from("12345");
console.log(uint16);
// Expected output: Int16Array [1, 2, 3, 4, 5]
语法
js
TypedArray.from(arrayLike, mapFn)
TypedArray.from(arrayLike, mapFn, thisArg)
其中 TypedArray
是以下类型之一:
参数
arrayLike
-
要转换为类型化数组的可迭代对象或类数组对象。
mapFn
可选-
对类型化数组的每个元素调用的函数。如果提供了该函数,数组中要添加的每个值首先会传递给该函数,然后将
mapFn
的返回值添加到类型化数组中。该函数使用以下参数调用: thisArg
可选-
执行
mapFn
时用作this
的值。
返回值
一个新的 TypedArray
实例。
描述
详情请参见 Array.from()
。
Array.from()
和 TypedArray.from()
之间存在一些微妙的区别(注意:下面提到的 this
值是指调用 TypedArray.from()
时的 this
值,而不是用于调用 mapFn
的 thisArg
参数):
- 如果
TypedArray.from()
的this
值不是构造函数,TypedArray.from()
会抛出TypeError
,而Array.from()
默认会创建一个新的Array
。 - 由
this
构造的对象必须是一个TypedArray
实例,而Array.from()
允许其this
值构造为任何对象。 - 当
source
参数是一个迭代器时,TypedArray.from()
首先从迭代器中收集所有值,然后使用计数创建一个this
实例,最后将值设置到该实例上。Array.from()
在接收到来自迭代器的每个值时设置其值,然后在最后设置其length
。 TypedArray.from()
使用[[Set]]
,而Array.from()
使用[[DefineOwnProperty]]
。因此,在处理Proxy
对象时,它调用handler.set()
来创建新元素,而不是调用handler.defineProperty()
。- 当
Array.from()
接收到一个不是迭代器的类数组时,它会保留空洞。TypedArray.from()
将确保结果是密集的。
示例
从可迭代对象(Set)
js
const s = new Set([1, 2, 3]);
Uint8Array.from(s);
// Uint8Array [ 1, 2, 3 ]
从字符串
js
Int16Array.from("123");
// Int16Array [ 1, 2, 3 ]
与箭头函数和 map 一起使用
使用箭头函数作为 map 函数来操作元素
js
Float32Array.from([1, 2, 3], (x) => x + x);
// Float32Array [ 2, 4, 6 ]
生成一个数字序列
js
Uint8Array.from({ length: 5 }, (v, k) => k);
// Uint8Array [ 0, 1, 2, 3, 4 ]
在非 TypedArray 构造函数上调用 from()
from()
的 this
值必须是一个返回 TypedArray
实例的构造函数。
js
function NotArray(len) {
console.log("调用 NotArray 时的长度", len);
}
Int8Array.from.call({}, []); // TypeError: #<Object> is not a constructor
Int8Array.from.call(NotArray, []);
// 调用 NotArray 时的长度 0
// TypeError: Method %TypedArray%.from called on incompatible receiver #<NotArray>
js
function NotArray2(len) {
console.log("调用 NotArray2 时的长度", len);
return new Uint8Array(len);
}
console.log(Int8Array.from.call(NotArray2, [1, 2, 3]));
// 调用 NotArray2 时的长度 3
// Uint8Array(3) [ 1, 2, 3 ]
规范
Specification |
---|
ECMAScript® 2026 Language Specification # sec-%typedarray%.from |