2017-02-13 7 views
0

Immutable.jsのMapデータ構造体にはfirst()メソッドがあります。Immutable.js Map()データ構造体のfirst()メソッドを使用する

私の理解しているように、マップは順不同です。どのようにfirst()メソッドは常に同じアイテムを返しますか?

it('should return the value of the fist item in data structure',()=> { 
    var x = Immutable.Map({a: 10, b: 20, c: 30}); 
    expect(x.first()).to.equal(10); //passess everytime 

    }); 

答えて

0

それはあなたが(あなたがを使用している、オブジェクト初期化子のおかげで、おそらく、少なくとも部分的に、ブラウザに依存する)に依存することができていない実装の単なる副産物です。それはthe documentationの通りです:

マップの反復順序は不定ですが、安定しています。

したがって、順序は定義されておらず、1つのドット回転から次の回転に変化する可能性があります。しかし、同じコードを繰り返しても、同じ結果が出ます。コンピュータは決定論的です。 ES2015まで


、JavaScriptのオブジェクトは、正式にそのプロパティに順序を持っていませんでした。 ES2015の時点ではそうしていますが、その順序にはいくつかの操作が続くことが保証されています。とりわけ、for-inObject.keysも、仕様に従って仕様書に従う必要はありません。したがって、マップを構築するには渡すオブジェクトを反復処理する必要があるため、表示される結果(未定義)はJavaScriptエンジンからJavaScriptエンジンまでさまざまです。つまり、仕様の前であっても、ほとんどのエンジンは、同じ方法でオブジェクト階層内の同じレベルでプロパティを処理しました(プロパティの作成順序、配列インデックスとしてのプロパティ名を無視するとオブジェクト初期化子のプロパティが追加されますソースコード順のオブジェクトに[ES5でさえ])。

+0

副産物であり、頼りにならないものなら、なぜこの方法を提供するのですか? – runtimeZero

+1

@runtimeZero: 'Map'は' firstter'を定義する 'Iterable'を拡張する' Iterable.Keyed'を拡張する 'Collection.Keyed'を拡張します。 ''最初の ''を持つことは基本的に '' Iterable''の副産物です。なぜなら、 '' Map'sを反復できるのは便利です(反面、 'first'自体は未定義の反復順序を持つコレクションにとっては特に有用ではない) 。 –

関連する問題