3

重複の可能性:
配列とオブジェクトの違いは何ですか?
アイテムは配列に存在しますが、配列の長さが0であると表示されますか?

javascriptのオブジェクトと連想配列で少し混乱しています。私はこれを読みました:質問ですが、この質問は両方に大きな違いはないと言っています。私はこれをコンソールに書きました:

var a = [];
a["A"] = 1;

var b = {};
b["B"] = 2;

var c = new Object();
c["C"] = 3;

上記の出力は次のとおりです。

a gives {A : 1} 
b gives {B : 2}
c gives {C : 3}

上記の3つのケースはすべて、オブジェクトを提供するのと同じ結果になります。問題は、上記の3つのケースすべてがjavascriptでどのように扱われるかです。

4

5 に答える 5

2

配列もオブジェクトであるため、数値以外のインデックスも使用できます。これらは、配列データの一部ではなく、配列オブジェクトにプロパティとして追加されます。

配列とオブジェクトの違いは、配列が数値インデックスを持つプロパティを配列データの一部としてカウントし、lengthそれに応じてプロパティを更新することです。(また、Arrayオブジェクトには、配列データを操作するための特定のメソッドがいくつかあります。)

var a = [];
a[42] = 1337;

これで、長さが変更され、アイテムが含まれるようになりました。

alert(a.length); // shows 43

文字列または数値をインデックスとして使用することは重要ではありません。数値インデックスは、文字列であってもカウントされます。

alert(a[42]); // shows 1337
alert(a["42"]); // shows 1337

長さを短くすると、その外側のプロパティが削除されます。

a.length = 10;
alert(a[42]); // shows undefined
于 2013-01-26T15:24:15.813 に答える
1

あなたの例では、bcは本質的に同じものです。なぜなら{}、はと同等だからですnew Object()

に戻ると、これは、数値プロパティ(uint32に基づく)が異なる方法で処理されるという意味で特別な種類であるとa定義されています。これらのプロパティが追加および削除されると、そのプロパティが更新されます。ArrayObjectlength

インデックスとして使用すると、プロパティの操作'A'方法によって定義される通常のプロパティとして扱われるため、Objectとして、a.Aまたはa['A']のインデックスにアクセスできますが、のインデックスには[5]を使用してのみアクセスできますa[5]

[]通常、プロパティがゼロ以外でない限り、配列のデバッグ出力は常にlengthであるため、表示した出力はやや不規則です。

トリビア

ECMAScriptのドキュメントによると、特定の値pは、次の場合にのみ配列インデックスになります。

(p >>> 0 === p) && (p >>> 0 !== Math.pow(2, 32) - 1)

参照:

アイテムは配列に存在しますが、配列の長さが0であると表示されますか?

于 2013-01-26T15:16:03.183 に答える
1

何かを明確にすることから始めましょう。

new Object()と同じです{}

new Array()と同じです[]

後者は前者の短縮形です。

舞台裏では、JavaScript のすべてが基本的にオブジェクトです (これは誇張ですが、かなり正確です)。配列は単にオブジェクトから派生したものです。これは、配列が実際にどのように見えるかのかなり初歩的な例です:

var myArray = {};

myArray[0] = 'value1';
myArray[1] = 'value2';
myArray[2] = 'value3';
myArray[length] = 3;

配列のプロトタイプには、すべてのメソッドが含まれています。例えば:

// myArray#push
myArray.prototype.push = function(val){
  myArray[this.length] = val;
  this.length++;
}

これを説明する別の方法は、配列を取り、数値ではないキーを追加することです。

 var example = [];

 example.push(0);
 example.push(1);
 example.push(2);

 example['a'] = 'a';
 example['b'] = 'b';
 example['c'] = 'c';

 example.log = function(){
   for(var i = 0, l = this.length; i < l; i++){
     console.log( example[i] );
   }

   console.log(this['a']);
   console.log(this['b']);
   console.log(this['c']);
 }

 // example[0] is 0
 // example[1] is 1
 // example[2] is 2

 // example.log is my custom function

 example.log(); // results in
 // 0
 // 1
 // 2
 // a
 // b
 // c

また、コンソールに表示されるすべての情報を常に信じてはいけません。たとえば、次のようにします。

var console_confusion = {};

console_confusion.length = 100;
console_confusion.splice = function(){ /* do absolutely nothing */ };

console.log( console_confusion );//results in
//
// in Chrome:
// [undefined × 100]
//

Chrome は、長さの数値プロパティとスプライス関数を持つものを配列として解釈します。これが、jQuery オブジェクトがコンソールで配列のように見える理由です。

于 2013-01-26T15:28:15.890 に答える
0

次の記事をお読みください– <a href="http://www.2ality.com/2012/12/arrays.html" rel="nofollow"> http://www.2ality.com/2012/12/arrays .html

[]つまり、 JavaScriptで示される「通常の配列」も、と同じよう{}にオブジェクトですが、lengthプロパティキーと「数値」キー(「インデックス」)に加えて__proto__、オブジェクトの内部プロパティポイントがあり、次のようなすべてのメソッドArray.prototypeを保持します。またはなど。ArraypushforEach

于 2013-01-26T15:21:39.157 に答える
0
first is an array
second is an object array
third is an array object
于 2013-01-26T15:58:11.937 に答える