2011-07-21 13 views
0

私はここでそれを失っている..私は今このループがどのように動作するかについて非常に混乱している。 W3学校からFor .. inループ?

var person={fname:"John",lname:"Doe",age:25}; 

for (x in person) 
{ 
document.write(person[x] + " "); 
} 

人は右のプロパティを持つオブジェクトですか?これらのプロパティはどのようにかっこでアクセスしていますか?私は配列のためだと思った?

がなぜこれも動作しませんし、それだけのようであってはならないこの?:

var person=[]; 
person["fname"] = "John"; 
person["lname"] = "Doe"; 
person["age"] = "25"; 


for (x in person) 
{ 
document.write(person[x] + " "); 
} 
+2

@ThiefMaster:質問キーを押したままにするか、繰り返し押すかどうかはわかります。彼らがなぜそれらの事柄の1つをなぜ行うのか不思議から離れて。いずれにせよ、私は彼らがそれを行うときに "クレイジーgrrrrrr怒っている"顔を想像することができます... –

+3

@ThiefMaster "FEWERの質問マークをお願いします。 – skyfoot

+0

申し訳ありませんが、私は疲れて少し挫折しました。プログラミングはとても分かりやすく感情がないですが、少し表現する必要があると感じました。 – mowwwalker

答えて

3

、例えばあなたの例ではobj[x]です。 obj.xは、文字通りxのプロパティ(つまりobj['x'])を意味します。これはあなたが望むものではありません。

アレイは角括弧でのみ動作しますが、角括弧は配列に限定されません。配列もオブジェクトのフードの下にありますが、数値キー用に設計されています。 でも、非数値キーでプロパティを追加しますが、それはそれらが設計されたものではありません。

0

JavaScriptはプロパティは、両方のオブジェクト[キー]とobject.key(およびいくつかの他の方法でアクセスできるオブジェクト、おそらく)。彼らが働くのと同じように。

2番目の例では、配列は特殊なオブジェクトですが、依然としてオブジェクトです。

+0

2番目の例は*配列ではありません*。 – KooiInc

+0

'var person = [];'は配列を作成します。 – binarious

+0

私はそれがオブジェクトであると言っています。配列はオブジェクトです:-) – ikanobori

0

のjsオブジェクトは、アソシエイティブな配列であり、キーと値のペアの集合であることを意味します。
ブラケットについて混乱している場合は、しないでください! Javascriptオブジェクトのプロパティには、 "。"

ほとんどの場合、同じように動作します。
これは設定とブラウザの実装の問題です(例:firefoxは角括弧付きの方が速く、chromeは点付きで速く動作します)。
ドット構成が失敗する状況があります。「some-key」という名前のプロパティを持つオブジェクトがあるとします。
ドット表記でアクセスする場合:object.some-key、コードは2つの値の差として解釈されているため、ほとんどの場合エラーが発生します。object.some - key。この場合、角括弧(object['some-key'])を使用してください。
.,;\* ...などの特殊文字がキーに既に含まれており、その中にはすでにjavacriptで解釈されている他のケースもあります。

0

http://bonsaiden.github.com/JavaScript-Garden/#object.general

「オブジェクトのプロパティは、ドット表記、または角括弧表記法のいずれかを介して、二つの方法でアクセスすることができます。」

  • obj.key
  • obj['key']

第2の方法の利点は、あなたも動的にキーを提供することができるということです:あなたは、オブジェクトのプロパティへのアクセス権を持っている2つの方法があります

0

JavaScriptでブラケット演算子を使用して、オブジェクトリテラルと配列の両方にアクセスできます。オブジェクトの場合、ブラケットのオペレータは、ブラケットの値をStringに変換し(Stringでない場合)、それが実際にプロパティであるかどうかをチェックすることによってObjectのメンバにアクセスします(mdc)。

2番目の例では、JavaScript(link)で推奨されていない「連想配列」を使用することを提案しています。

あなたの質問に答えるには、Mapのような構造(つまり、キー値ペアを保持するオブジェクト)を書くことで、for-inループを繰り返し処理する標準的な方法(imo)がObjectリテラルです。より伝統的な配列を書く標準的な方法はArrayObjectです。

var map = { "a": "string" , "b": 0 , "c": null } ; 

    for(key in map) console.log("(!!) map # " + key + " : " + map[key]) ; 

var list = ["string",0,null] ; 

    for(i = 0 ; i < list.length ; i++) console.log("(!!) list # " + i " : " + list[i]) ;