2

オブジェクトのサイズの取得は、通常、反復とカウント、またはO(n)であるObject.keys(obj).lengthで構成されます。私がMapに切り替えると、Map.sizeがO(1)で実行されると仮定できますか?Javascript:ES6 Map.size一定時間を読み込んでいますか?

私はC++の世界から来て、Javascriptにはかなり新しく、言語によって提供されるすべての機能の時間的複雑さを規定した標準を見つけることができなかったことにショックを受けました。

答えて

2

ソースコードを検証した経験がある実装を除いて、それを頼りにすることはできません。

をMap.prototype.size

Map.prototype.sizeは、そのアクセッサ設定機能未定義あるアクセサプロパティで得る:The specificationMap.prototype.sizeがループロジックとゲッターであることを示しています。そのアクセサ取得機能は、次の手順を実行します。

  1. Mこの値とします。
  2. タイプM)がObjectでない場合は、TypeError例外をスローします。
  3. Mに[[MapData]]内部スロットがない場合は、TypeError例外をスローします。
  4. のエントリのMの[[MapData]]内部スロットの値にします。
  5. カウントがp場合エントリ
    • の要素である各レコード{[[キー]]、[[値]]} Pについて0
    • とします。 [[Key]]が空でない場合は、の数がからの数が +1と設定されています。
  6. 戻り値カウントです。

しかし、実装はsizeのセマンティクスが変更されていない提供を最適化するのは自由です。

関連する問題