TypedArray.from
TypedArray.from
TypedArray.from()
方法 从一个类数组或者可迭代对象中创建一个新类型数组。 这个方法和 Array.from()
类似。
语法
TypedArray.from(source[, mapFn[, thisArg]])
where TypedArray is one of:
Int8Array
Uint8Array
Uint8ClampedArray
Int16Array
Uint16Array
Int32Array
Uint32Array
Float32Array
Float64Array
参数
source
想要转换为类型数组的类数组或者可迭代对象。mapFn
可选参数。如果指定了该参数,则最后生成的类型数组会经过该函数的加工处理后再返回。thisArg
可选参数。执行 mapFn
函数时 this
的值。
返回值
一个新的TypedArray
实例。
描述
TypedArray.from()
允许你从下面两者来创建数组:
- 类数组对象(拥有一个
length
属性和若干索引属性的任意对象)
- 可迭代对象(你可以从它身上迭代出若干个元素的对象,比如有
Map
和Set
等)。
TypedArray.from()
方法有一个可选参数 mapFn
, 让你可以在最后生成的类型数组上再执行一次map
方法后再返回。也就是说 TypedArray.from(obj, mapFn, thisArg)
和TypedArray.from(Array.prototype.map.call(obj, mapFn, thisArg))
是等价的。
from()
的length
属性为1.
Array.from()
和 ypedArray.from()
之间有一些微妙的区别:
- 如果
|this|
的值传递给TypedArray.from
不是一个构造器,TypedArray.from
将抛出{jsxref("TypeError")}}, 而Array.from
默认将创建一个Array
.
TypedArray.from
使用[Put]
而rray.from
使用[DefineProperty]]
. 因此, 当和Proxy
对象一起时, 它调用handler.set
创建一个新的元素而非handler.defineProperty
.
- 当
from
获得一个迭代器时,TypedArray
一开始收集迭代器中的所有值, 此时创建一个|this|
的实例用于计数, 然后在实例中设置值。Array.from
设置每个从迭代器其中获取的值,最后设置它的长度。
- 当
Array.from
获得一个不可迭代的类数组时, it respects holes, 而TypedArray.from
将确保结果是 dense.
示例
// Set (iterable object)
var s = new Set([1, 2, 3]
Uint8Array.from(s
// Uint8Array [ 1, 2, 3 ]
// String
Int16Array.from('123'
// Int16Array [ 1, 2, 3 ]
// Using an arrow function as the map function to
// manipulate the elements
Float32Array.from([1, 2, 3], x => x + x
// Float32Array [ 2, 4, 6 ]
// Generate a sequence of numbers
Uint8Array.from{length: 5}, (v, k) => k
// Uint8Array [ 0, 1, 2, 3, 4 ]
Polyfill
你可以通过在脚本的开始部分插入以下代码来部分解决这个问题,允许在本来不支持它的实现中使用from()的大部分功能。
if (!Int8Array.__proto__.from) {
(function () {
Int8Array.__proto__.from = function (obj, func, thisObj) {
var typedArrayClass = Int8Array.__proto__;
if(typeof this !== 'function') {
throw new TypeError('# is not a constructor'
}
if (this.__proto__ !== typedArrayClass) {
throw new TypeError('this is not a typed array.'
}
func = func || function (elem) {
return elem;
};
if (typeof func !== 'function') {
throw new TypeError('specified argument is not a function'
}
obj = Object(obj
if (!obj['length']) {
return new this(0
}
var copy_data = [];
for(var i = 0; i < obj.length; i++) {
copy_data.push(obj[i]
}
copy_data = copy_data.map(func, thisObj
var typed_array = new this(copy_data.length
for(var i = 0; i < typed_array.length; i++) {
typed_array[i] = copy_data[i];
}
return typed_array;
}
})(
}
规范
Specification | Status | Comment |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262)The definition of '%TypedArray%.from' in that specification. | Standard | Initial definition. |
ECMAScript Latest Draft (ECMA-262)The definition of '%TypedArray%.from' in that specification. | Living Standard | |
浏览器兼容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 45.0 | 38 (38) | No support | No support | 10 |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | No support | No support | 38.0 (38) | No support | No support | 10 |