質問: **TypedArrayページに記載されている下記の意味が分かりません** ``` new TypedArray(object); ``` --- **Q1** > > TypedArray.from() メソッドを使用したかのように新たな Typed Array を生成 > > > ・これは「new TypedArray(object);」と「TypedArray.from();」が同義という意味ですか? ・それとも「TypedArray.from(source);」で第1引数のみを指定したときと同義という意味? --- **Q2.new TypedArray(object);で指定可能な引数は下記何れかですか?** ・配列型 (array-like) オブジェクト ・反復可能 (iterable) オブジェクト
回答: 最初に`TypedArray.from()`の動作から確認します。詳細な処理内容はECMAScript 2017 仕様書の22.2.2.1 %TypedArray%.fromに記載されています。 `TypedArray.from()`は三つの引数を受け取る事ができます。一つは`sorurce`、二つ目は省略可能で`mapfn`、三つ目は省略可能で`thisArg`です。 まず、`source`がイテレーター(`@@iterator`)を持つかどうか(iterableかどうか)で違います。イテレーターを持つ場合はイテレーターを用いて各要素を取得し、入れていきます。このとき、`mapfn`が`undefined`以外が渡されている場合は`thisArg`を`this`として`mapfn`で変換した要素をいれることになります。(step 6.) sourceがイテレーターを持たない場合はarray-likeであることを想定して動作します。`0`から`source.length - 1`までの数値プロパティを順番に取得し、入れていきます。`mapfn`が`undefined`以外が渡されている場合の処理もイテレーターと同様に行います。(step 7.以降) 次に`new TypedArray(object)`の動作です。詳細な処理内容はECMAScript 2017 仕様書の22.2.4.4 TypedArray ( object )に記載されています。 こちらもまず、`object`がイテレーターを持つかどうかになります。イテレーターを持つ場合は`mapfn`による変換の部分を除き`TypedArray.from(object)`とした場合とほぼ同じ動作になります。(step 6.) イテレーターを持たない場合もarray-likeと想定してどうすることになり、`TypedArray.from(object)`とほぼ同じ動作になります。(step 7.以降) 以上を踏まえ、Q1.の回答は**第一引数のみ指定した`TypedArray.from()`とほぼ同じ**となります。ただ注意すべき違いがあります。 1. `new TypedArray(object)`は引数がObject型で、かつ、`[[TypedArrayName]]`や`[[ArrayBufferData]]`を内部に持たない場合の処理です。数値や、他のTypedArray、Bufferの場合は呼び出される処理が異なります。 2. `new TypedArray(object)`では変換のための第二引数以降をあたえることはできません。 3. `TypedArray.from`は内部で、`new TypedArray(length)`という形でコンストラクタ呼び出しを行って、TypeArrayオブジェクトを作成してからその中に要素を入れています。対して、`new TypedArray(object)`はコンストラクタによるオブジェクト作成そのものになり、各要素を入れ終わらないとオブジェクトの作成が完了しません。 特に`Array.from`が`new TypedArray(object)`を呼び出しているわけでも、その逆でも無い事に注意してください。あくまで、iterableやarray-likeに対する処理の仕方が同じであると言うだけで、オブジェクトが作られる工程は独立して存在します。 しかし、`new TypedArray(object)`は`TypedArray.from()`同様iterableもarray-likeも扱えることには変わりありません。よって、Q2.の回答は**両方**です。iterableであればiterableとして処理し、それ以外はarray-likeとなります。ただし、array-likeは想定であり、`length`プロパティなどが正しく設定されていない場合はエラーや予期せぬ動作になります。