39092


**[TypedArrayページ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/TypedArray)に記載されている下記の意味が分かりません**

[code]

     new TypedArray(object);
    
[/code]

* * *

**Q1**

> TypedArray.from() メソッドを使用したかのように新たな Typed Array を生成

・これは「new TypedArray(object);」と「TypedArray.from();」が同義という意味ですか？  
・それとも「TypedArray.from(source);」で第1引数のみを指定したときと同義という意味？

* * *

**Q2.new TypedArray(object);で指定可能な引数は下記何れかですか？**

・配列型 (array-like) オブジェクト  
・反復可能 (iterable) オブジェクト


CC BY-SA 3.0
2017-10-28T00:12:08.053
39087
2017-10-28T03:02:15.173
7886
question
javascript
「new TypedArray(object);」「TypedArray.from();」は同義ですか？


最初に`TypedArray.from()`の動作から確認します。詳細な処理内容はECMAScript 2017 仕様書の[22.2.2.1
%TypedArray%.from](http://www.ecma-
international.org/ecma-262/8.0/#sec-%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 )](http://www.ecma-international.org/ecma-262/8.0/#sec-
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`プロパティなどが正しく設定されていない場合はエラーや予期せぬ動作になります。


CC BY-SA 3.0
2017-10-28T02:55:36.343
39092
2017-10-28T03:02:15.173
2017-10-28T03:02:15.173
7347
7347
39087
answer