TypedArray.from() メソッドは、配列風オブジェクトや反復可能オブジェクトから新しい型付き配列を生成します。このメソッドは Array.from() とほぼ同じです。

構文

TypedArray.from(source[, mapFn[, thisArg]])

ここで TypedArray は次のいずれかです。

Int8Array
Uint8Array
Uint8ClampedArray
Int16Array
Uint16Array
Int32Array
Uint32Array
Float32Array
Float64Array

引数

source
型付き配列に変換する配列風オブジェクトか反復可能オブジェクト
mapFn
オプション。型付き配列のすべての要素に適用される map 関数。
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()TypedArray.from() の間には、いくつかの微妙な違いがあります。

  • TypedArray.from に渡された |this| 値がコンストラクターでなければ、 TypedArray.fromTypeError をスローします。Array.from は新しい Array を生成することがデフォルトとなっています。
  • TypedArray.from[[Put]] を使用します。Array.from[[DefineProperty]] を使用します。 従って Proxy オブジェクトを使っている場合は、TypedArray.from() が配列に新しい要素を追加するときに handler.defineProperty ではなく handler.set が呼び出されます。
  • from がイテレーターを取得するとき、 TypedArray バージョンは最初にイテレーターからすべての値を集め、その数を使用して |this| のインスタンスを生成し、そのインスタンスに値を設定します。 Array.from はイテレーターから取得して各値を設定し、最後にサイズを設定します。
  • Array.from はイテレーターではない配列風オブジェクトを引数に取ったときは、元の配列風オブジェクトで定義されていない番号の要素を空のまま残した疎配列 (sparse array) を生成します。一方、TypedArray.from は必ず密配列 (dense array) を生成します。

// Set (反復可能オブジェクト)
var s = new Set([1, 2, 3]);
Uint8Array.from(s);
// Uint8Array [ 1, 2, 3 ]


// 文字列
Int16Array.from('123');
// Int16Array [ 1, 2, 3 ]


// アロー関数を map 関数として使って要素を操作する
Float32Array.from([1, 2, 3], x => x + x);
// Float32Array [ 2, 4, 6 ]


// 数列を生成する
Uint8Array.from({length: 5}, (v, k) => k);
// Uint8Array [ 0, 1, 2, 3, 4 ]

ポリフィル

JavaScript エンジンの実装がこのメソッドにネイティブに対応していない場合、回避策として、以下のコードをスクリプトの先頭に挿入することで、 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;
        }
    })();
}

仕様書

仕様書 状態 備考
ECMAScript Latest Draft (ECMA-262)
%TypedArray%.from の定義
ドラフト  
ECMAScript 2015 (6th Edition, ECMA-262)
%TypedArray%.from の定義
標準 初回定義

ブラウザーの対応

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
基本対応Chrome 完全対応 45Edge 完全対応 14Firefox 完全対応 38IE 未対応 なしOpera 未対応 なしSafari 完全対応 10WebView Android 未対応 なしChrome Android 未対応 なしEdge Mobile ? Firefox Android 完全対応 38Opera Android 未対応 なしSafari iOS 完全対応 10Samsung Internet Android 未対応 なしnodejs 完全対応 4.0.0

凡例

完全対応  
完全対応
未対応  
未対応
実装状況不明  
実装状況不明

関連情報

ドキュメントのタグと貢献者

このページの貢献者: mfuji09, mandel59, shide55
最終更新者: mfuji09,