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 属性和若干索引属性的任意对象)

  • 可迭代对象(你可以从它身上迭代出若干个元素的对象,比如有 MapSet 等)。

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; } })( }

规范

SpecificationStatusComment
ECMAScript 2015 (6th Edition, ECMA-262)The definition of '%TypedArray%.from' in that specification.StandardInitial definition.
ECMAScript Latest Draft (ECMA-262)The definition of '%TypedArray%.from' in that specification.Living Standard

浏览器兼容性

FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support45.038 (38)No supportNo support10

FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic supportNo supportNo support38.0 (38)No supportNo support10