2016-09-10 13 views
0

なぜこの配列はlengthプロパティが0ですか?その質問へのフォローアップとして、インデックス値を持つこの配列の項目にアクセスできないのはなぜですか?なぜこの配列にインデックスでアクセスできないのですか?

次のことを考えてみましょう:

var box = []; 

box['material'] = 'cardboard'; 
box['size'] = 'small'; 

box.length; //0 
console.log(box); 
//[ material: 'cardboard', size: 'small' ] 

box[0]; //undefined 

しかし、私は次の操作を実行したとき:

var box = []; 
box['0'] = true; 
box['1'] = 'cardboard'; 
box['2'] = 'some value'; 

box.length; //3 
box[0];// true 

「0」の文字列ではないので、なぜ、それこの場合の出力正しい長さん番号と0のインデックスで正しい項目にアクセスしますか?

+0

(たとえば)を使用この質問はおそらく重複していますが、代入を 'box ['material'] = 'cardboard''とすると、実際には何もインデックスに格納していません。 –

答えて

2

JavaScriptでは、配列の長さは常に最大の数値(整数)プロパティ名の1倍です。配列の名前は数値ではなく、配列の長さには数えません(他の重要な状況では無視されます)。

オブジェクトのプロパティ名はです。常に文字列ですが、数値として解釈されるときは負でない整数値の文字列は配列内で特殊です。数値によるプロパティへのアクセスは、数値が最初に文字列に変換されるため機能します。したがって、box[0]box['0']はまったく同じことを行います。

+2

など。 'length'プロパティはそれ自身を数えません。 – melpomene

+0

配列は実際に配列またはオブジェクトですか?数値配列は配列だが、連想配列はオブジェクトであると聞く。どうしたの? – Viney

+1

@Novice配列はオブジェクトですが、 '.length'プロパティの動作は特殊です。 JavaScriptには実際には「連想配列」型はありません。 – Pointy

0

['material']を設定すると、値 'cardboard'を持つ 'material'というプロパティが作成されます。これはリストに要素を追加しません!

.push()を使用するか、必要なインデックスをasignする必要があります。

また、「0」の文字列を数値に同棲され、[「0」] OBJそうとOBJ [0]と同じである(ちょうど0のために、これはすべての数字のために起こりません)

0

私は思いますあなたはオブジェクトを配列と混同しています。配列は実際にjavascriptのオブジェクトですが、それは私たちを助けません。

インスタンス化しようとしているのは、キーと値のペア“material”->“cardboard”, “size”->“small”を持つ連想配列です。しかし、このようなデータ構造はjavascriptには存在しません。アレイは、唯一のインデックスとして整数を持っている必要があり、

box = []; 
box[0] = 'material'; 
box[1] = 'someValue'; 

のように、なぜあなたのコード(だけは連想配列であることをだ)

box = []; 
box['0'] = true; 
box['1'] = 'cardboard'; 

作品理由は、暗黙の型変換です。 boxは配列であると宣言しているため、文字列はこの位置では無効です.JavaScriptはそれを静かに整数に変換しますので、上記のように単純な退屈な整数インデックス配列を再度取得します。

あなたができることは、属性を持つobjectを作成することです。だからかもしれない、例えば、状態

box = {};   // box is now an object 
box.size = 'small'; // box now has an attribute called “size” 
        // which has the (string) value “'small'” 
box.material = 'cardboard'; 

またはオブジェクトリテラルの表記を使用して一度に:

box = { 
    size: 'small', 
    material: 'cardboard' 
}; 

これはJavaScriptで連想配列に取得することができます最も近いです。オブジェクトには長さがないことに注意してください。の属性番号にアクセスする場合は、Object.keys(box).lengthを使用する必要があります。 、キーを反復

for(var key in box){ 
    console.log('value of ' + key + ' is ' + box[key]) 
} 

注意にここで、配列のような表記を使用しますが、覚えておく:あなたは、オブジェクトではなく、配列を扱っている、それらに対処することは似ていますけれども。 boxはobject型であるため、自分で定義した属性だけでなく、すべてのオブジェクトに対して定義されている属性も取得します。あなたは、キーを追加する必要がある場合は、そこに自分を入れるだけでキーを取得するには、

for (var key in box) { 
    if (box.hasOwnProperty(key)) { 
     // do stuff 
    } 
} 

を使用し、すなわち、実行時に属性を、私は正確な答えを持っていない

//supposing that box was instantiated as above 
var listOfBoxAttributes = ['shape', 'color', 'weight']; 
for(var i in listOfBoxAttributes) 
    box[listOfBoxAttributes[i]] = undefined; 
関連する問題