ウェブサイト検索

node.js - JavaScriptオブジェクトの要素は特定の順序で初期化されますか?


私はそのような関数を持っています:

parsers[1] = function(buf) {
    return {
        type: "init",
        name: buf.readUTF8String(),
        capacity: buf.readUInt32(),
        port: buf.readUInt16()
    };
}

name、capacity、port が順番に初期化される保証はありますか? さもなければ、バッファが間違った順序で読み込まれることになります。

もちろん、私は次に頼ることもできた:

parsers[1] = function(buf) {
    var ret = {type: "init"};
    ret.name = buf.readUTF8String();
    ret.capacity = buf.readUInt32();
    ret.port = buf.readUInt16();

    return ret;
}

回答 #1

@joewsのコメントのおかげで、私は自分の質問に答えることができます。

リンク 11.1.5 オブジェクト初期化子から:

構文

オブジェクトリテラル :

  • { }

  • { プロパティ名と値のリスト }

  • { プロパティ名と値のリスト , }

PropertyNameAndValueList :

  • PropertyAssignment

  • プロパティ名と値のリスト、プロパティの代入

要するに、オブジェクトコンストラクタは、引数として何も渡さない場合、初期化値のリスト、または初期化値のリストに続いてコンマを取ります。

その初期化値のリストは、PropertyAssignment または初期化値のリストの後に PropertyAssignment が続くもので構成されており、基本的に再帰による PropertyAssignment のリストを意味します。

さて、最後の PropertyNameAndValueList , PropertyAssignment では、両方のコンポーネントが評価される特定の順序はありますか?

生成 PropertyNameAndValueList : PropertyNameAndValueList , PropertyAssignment は次のように評価されます:

  1. obj を PropertyNameAndValueList を評価した結果とします。

  2. propId を PropertyAssignment を評価した結果とする。

  3. ...

2. が 1. に確実に続く場合、順序は保証されます。

5.2 アルゴリズムの規約より:

仕様では、アルゴリズムの手順を指定するために番号付きリストを使用することがよくあります。これらのアルゴリズムは、ECMAScript 言語構造の必要な意味論を正確に指定するために使用されます。これらのアルゴリズムは、特定の実装技術を使用することを意味するものではありません。実際には、与えられた機能を実装するためにより効率的なアルゴリズムが利用可能な場合があります。

...

表現を明確にするために、アルゴリズムのステップは順次のサブステップに細分される場合があります。

つまり、私が理解する限り、期待される初期化の順序は要素ごとに順番に進むということです。

回答 #2

他の多くの言語と同様に、オブジェクトのプロパティの「順序」や、それらが初期化される方法や値が割り当てられる方法に依存することはありません。

もし「外部の」順序が必要であれば、私はこれらのプロパティのマッピングのような方法でそれを達成しようとするでしょう。