5

まず第一に、私は理論的に巨大であると言いたいです。私は抽象化が好きではありません。使用する前に、どのように機能するかを知りたいです。for-inループのプロパティ名(値ではない)を取得する背後にある簡単な理論をどこでも探しています。私はそれをコードで示しますので、うまくいけば誰かがそれがどのように正確に機能するかを説明できる可能性があります...

var obj = { one: 1, two: 2, three: 3 }; // A basic object instantiated with 3 public properties.

for (var prop in obj) {
    console.log(prop); // logs "one", "two" and "three" ???
}

prop変数を1、2、3として評価すると思いましたが、実際のプロパティ名はログアウトされます。obj [prop]がこれらのプロパティの実際の値に評価されるものであることは知っていますが、これは私にとっては始まりのようなものです。propは別の参照を格納する参照ですか?

これについて、forループの変数iが配列のインデックスのようなものであるという観点から考えようとしています。

また、これは何ですか、それは私が求めているものと似ていますか?

var obj = { "one": 1, "two": 2, "three": 3 };

プロパティ名の文字列はどのようになっていますか?... var "string" = "Hello、World!";とは言えません。それは違法です。

4

4 に答える 4

4

私はその質問を完全には理解していないことを認めなければなりませんが、それでも私はできる限り最善を尽くして答えようとしています。オブジェクトハッシュ(-table )にほぼ匹敵します。ご存知のように、それは識別子とその識別子の後ろに格納されている値で構成されています。

ECMAscriptでは、その識別子はオブジェクト内のキーです。

配列の場合、ループするときに受け取りたい興味深いものは1つだけです。これは、その「キー」が単なるインデックス付きの数値であるためです(実際には、ここでは文字列でもありますが、これは補足です)。ただし、オブジェクトキーは何でもかまいません。そのため、オブジェクトキーをループするときに競合が発生します。キーまたはを取得しますか?

for-inそれがループがある理由です。キーをループしているので、そのキーを使用して、背後の値にアクセスすることもできます。


しかし、あなたは混乱に完全に一人ではありません。そのため、ECMAscript Nextfor-ofは、このロジックを反転させるオブジェクトのループを導入します。キーの代わりに、値を直接ループします。

var obj = { one: 1, two: 2, three: 3 };

for(var value of obj) {
    console.log(value); // 1, 2, 3
}
于 2012-11-23T12:10:04.900 に答える
3

オブジェクトプロパティの名前文字列であり、が有効な識別子である場合obj.propの単なる構文糖衣です。あなたは例えば言うことはできません、あなたは書く必要がありますobj["prop"]propobj.my propertyobj["my property"]

for..inオブジェクトとそのプロトタイプチェーン内の列挙可能なキーを列挙し、現在の文字列キーを左側に割り当てます。だからあなたはこれを行うことができます:

var a = [], i = 0;
for( a[i++] in obj );

//a is an array: ["one", "two", "three"]

ループが進行すると、左側が参照に対して評価され(iこれの副作用として増分)、現在のキーが割り当てられます。したがって、のようa[0] = keya[1] = key2なります。

すべての詳細が必要な場合は、次の仕様を参照してください。

于 2012-11-23T12:09:25.570 に答える
1

JavaScriptオブジェクトは辞書であり、キーは任意の文字列であり、必ずしも有効なJavaScript識別子である必要はありません。したがって、プロパティ名(つまり、任意の有効な文字列)として使用できるものがありますが、変数名としては使用できません。

For / inは、(列挙可能な)プロパティ(つまりキー)をループするように定義されています。これは、次のような配列にも当てはまります。

for (var i in [10,20,30]) document.write (i);

「102030」ではなく「012」を出力します。

プロパティは列挙できないように定義できます。その場合、for/inはそれをスキップします。ECMAScript 5では、列挙できないプロパティを自分で定義できます。列挙順序は未定義です。hasOwnPropertyfor / inは、プロトタイプのプロパティも考慮することに注意してください(これが、ループのすぐ内側に条件が頻繁に表示される理由です)。

于 2012-11-23T12:04:55.193 に答える
1

propは別の参照を格納する参照ですか?

いいえ、prop反復で到達した要素のキーです。文字列。

それでおしまい。それ以上に複雑なことはありません。

var "string" = "Hello、World!";とは言えません。それは違法なので

これは完全に異なる言語機能でもあります...

間違いなく、オブジェクトは、特定した制限を回避するために少なくとも部分的に提供されました。

于 2012-11-23T12:13:17.577 に答える