21

関数の戻り値に基づいてプロパティを割り当てるオブジェクトがあるとします。

var i = 0;

var f = function() { return ++i; }

var foo = {
            a:f(),
            b:f(),
            c:f()
          };

foo.a が 1、foo.b が 2、foo.c が 3 になることが保証されていますか? オブジェクトを繰り返し処理するとき、JS が順序を保証しないことは知っていますが、代入はどうですか?

JS仕様のどこかに明記されていますか?私は教育上の理由だけを求めています。

ありがとう。

4

5 に答える 5

18

標準 ECMA-262 (5.1) - セクション 11.1.5 - オブジェクト初期化子

プロダクション PropertyNameAndValueList : PropertyNameAndValueList 、 PropertyAssignment は次のように評価されます。

1. Let obj be the result of evaluating PropertyNameAndValueList.
2. Let propId be the result of evaluating PropertyAssignment.
...
5. Call the [[DefineOwnProperty]] internal method of obj with arguments propId.name, propId.descriptor, and false.
6. Return obj.

そうです、注文は標準によって強制されます。

于 2013-04-24T19:37:56.207 に答える
1

JS の新しいバージョンを定義する ECMAScript 6 wiki から:

スコープ (Block、FunctionBody、Program、ModuleBody など) に入ると、すぐに含まれるすべての関数およびクラス宣言によって宣言された変数が、それぞれの関数およびクラスにバインドされます。次に、すべてのクラス本体がテキスト順に実行されます。クラス本体は、クラス定義が評価されるときに一度、クラス全体のプロパティを定義して初期化します。これには、コンストラクター関数 (「クラス」自体) とそのプロトタイプ プロパティのプロパティが含まれます。これらの初期化は、テキストの順序で行われます。

ソースが到着しました!JavaScript オブジェクトのプロパティは、オブジェクトのテキスト順に初期化されます。配列は (現在) 常にこの規則に従っているわけではありません。

ソース: http://wiki.ecmascript.org/doku.php?id=harmony:classes

ECMAScript 5 で参照が見つかったら、この投稿を編集しますが、そこにあることは確かです。

編集:見つけた

ECMAScript 5 にはそれがあります: http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.3.7

実装で for-in ステートメントの特定の列挙順序が定義されている場合、このアルゴリズムのステップ 3 でリスト要素を並べ替えるには、その同じ列挙順序を使用する必要があります。

これにより、呼び出しが定義DefineOwnPropertyされ、内部テーブル内のプロパティの位置が定義されます。

于 2013-04-24T19:37:19.190 に答える
0

割り当ては常に順番に行われます。これは、コードが検出され、解釈され、実行される方法です。

于 2013-04-24T19:19:15.387 に答える
0

はい、a が 1、b が 2 などになることが保証されています。それぞれf()は、記述した順序で解釈されます。

于 2013-04-24T19:19:28.603 に答える
0

引用する公式の情報源はありませんが、少し常識を働かせてみましょう。

割り当てが順番どおりに行われなかった場合はどうなりますか? どの値がどのプロパティに割り当てられるかを知ることはできず、オブジェクト構造が役に立たなくなります(少なくともオブジェクト リテラル構文を使用する場合)

それが関数呼び出しであるか、プリミティブ リテラルであるか、またはその他の値であるかに違いはありません。順番に起こることが保証されていなければ、うまくいきません。


ECMAScript 5 で用語を簡単に検索した後、left to right役立つ場合は次の結果が得られます。

7 語彙規則

ECMAScript プログラムのソース テキストは、最初に一連の入力要素 (トークン、行末記号、コメント、または空白) に変換されます。ソース テキストは左から右にスキャンされ、可能な限り長い文字列が次の入力要素として繰り返し取得されます。

11.8.5 抽象リレーショナル比較アルゴリズム

...ECMAScript では式の左から右への評価を指定しているため必要です。

附属書 D (参考情報) 第 3 版との互換性に影響を与える可能性のある第 5 版の訂正と説明

ECMAScript では通常、左から右の評価順序が使用されますが、Edition 3 仕様言語の > および <= 演算子では部分的に右から左の順序になります。これらの演算子の仕様が修正され、左から右への完全な評価順序が指定されるようになりました。

于 2013-04-24T19:29:30.750 に答える