2011-12-25 13 views
30

なぜ文字列を配列のキーとして使用するのですか?この値が宣言されていない配列がコンソールに表示されます。しかし、私はそれらの価値を得ることができます。JavaScriptの配列のキーとしての文字列

>> var arr = [ 0, 1, 2, 3 ]; 
    undefined 

>> arr["something"] = "aught"; 
    "aught" 

>> arr 
    [0, 1, 2, 3] 

>> arr["something"] 
    "aught" 

>> for(var i = arr.length; i--; console.log(arr[ i ])); 
    3 
    2 
    1 
    0 

私は配列はジャバスクリプトのエンジンで「列挙」インターフェースのいくつかの種類を実装したオブジェクトであることを理解しています。 最も興味深いのは、インタプリタが警告またはエラーを投げているわけではないので、データが失われる可能性のある場所を検索するのに少し時間を費やしました。 私は今、私が間違っていたと私は配列の2種類があるJavaScriptで[]代わりに{}

答えて

69

を用いる標準配列と連想配列

  • [ ] - 標準配列 - 0から始まる整数インデックスのみ
  • { } - 連想配列 - あなたが定義したキーが

だから、任意の文字列でできたJavaScriptオブジェクト:

var arr = [ 0, 1, 2, 3 ]; 

インデックスは整数にしかできない標準的な配列を定義しています。 arr["something"]something(インデックスとして使用するもの)から整数に変換していないので、基本的にはarrオブジェクトのプロパティを定義しています(すべてがjavascriptのオブジェクトです)。しかし、標準配列に要素を追加するわけではありません。

+2

@abuduba、何も間違っていないので:-)あなたのコードは完全に有効なjavascriptです。 2種類の配列を混在させていますが、それは有効ですので、読者にとってあいまいです。なぜ何か間違っていないときに、何かが間違っていることを通訳者に示させたいのですか? –

+18

これは主に用語の問題ですが、javascriptは一般的に連想配列 '{}'を呼び出しません。彼らはそれをプロパティを持つオブジェクトと呼びます。ほとんどの人が、javascriptオブジェクトを連想配列と呼ぶことで物事を混乱させないのが最善であることに同意しないのですか? – jfriend00

+1

注: '' Object.defineProperty.call(arr、 'something'、 'aught'); ''のように配列に '' defineProperty''を使用しようとするとエラーになります。 – David

9

for(var i = arr.length; i--; console.log(arr[ i ]));

これはもちろん、あなたの数値指標を与えるだろうが、あなたは、両方の数値指標と、このようなあなたの配列の文字列キーの上にまだループすることができます:

for (var x in arr) { 
    console.log(x + ": " + arr[x]); 
} 
/* (console output): 
    0: 0 
    1: 1 
    2: 2 
    3: 3 
    something: aught 
*/ 
+1

だから、この 'Array.prototype.somethingCool ="を本当に ";"ではなく、あなたのfor-in-loopを走らせてください!! – KhaledMohamedP

関連する問題