11

重複の可能性:
キー/値ペアのJavascriptでのオブジェクトと配列

ハッシュのように使用しているJavaScriptの変数があります。私はそれを次のように初期化することができます:

var selected = [];

また

var selected = {};

そしてそれはまったく同じことをします。たとえば、次のように使用しています。

selected["one"] = 1;

if (selected["one"] == 1) console.log("one is selected"); 
// result: one is selected

if (selected["two"] != 1) console.log("two is not selected");
// result: two is not selected

selected["one"] = 0;

if (selected["one"] != 1) console.log("one is no longer selected");
// result: one is no longer selected

本当に違いはありますか?1つはオブジェクトで、もう1つは配列ですか?もしそうなら、いつ問題が発生することを期待すべきですか。つまり、2つの使用法の違いは何ですか。また、なぜどちらかを選択したのでしょうか。

4

7 に答える 7

20

[]は配列、{}はオブジェクトです。配列は、数値キーのみを割り当てることを目的としたオブジェクトのタイプです。

理論的にはそれらを交換可能に使用できますが、JSON 化するとどうなるか見てみましょう。

var tmp = []; // or: var tmp = {}
tmp.one = 1;
JSON.stringify(tmp);

// array:
'[]'

// object:
'{"one":1}'
于 2012-08-23T18:27:41.817 に答える
4

配列 ( []) はオブジェクト ( ) の一種です{}。主な違いは次のとおりです。

  • length配列には、設定された最大の数値キー (プラス 1) に等しい魔法のプロパティがあります。

    var a = [];
    a[100] = 0;
    a.length; // is 101
    
    var o = {};
    o[100] = 0;
    o.length; // is undefined
    
  • 配列のtoStringメソッドは数値キーの値を出力します:

    var a = [];
    a[0] = 5;
    a[1] = 6;
    a[2] = 7;
    a.toString(); // "[5,6,7]"
    
    var o = {};
    o[0] = 5;
    o[1] = 6;
    o[2] = 7;
    o.toString(); // "[object Object]"
    
  • 配列には、レコードを処理するための多くの特定の関数があります。

    > Object.getOwnPropertyNames(Array.prototype)
    ["join", "toLocaleString", "sort", "some", "lastIndexOf", "splice", "map",
     "constructor", "every", "unshift", "shift", "indexOf", "pop", "forEach", "reverse",
     "reduce", "slice", "concat", "filter", "toString", "reduceRight", "push", "length"]
    
于 2012-08-23T18:31:59.013 に答える
2

はい、{}空のオブジェクトで[]あり、空の配列です。配列一種のオブジェクトであり、値のリストを処理するように最適化されていますが、他の Javascript オブジェクトと同様に、 or などの他の属性を受け入れることができることに注意"one"してください。つまり、 :はすべての配列の属性です。実際、問題なくオーバーライドすることもできます。配列は、すべての Javascript オブジェクトと同様に、任意のキーと値の割り当てをサポートしています。"two"myArray.push(1)pushmyArray["push"] = someOtherFunctionpush

ただし、最終的には、舞台裏のパフォーマンスに関係しています。値の連続したリストを格納しようとしている場合、配列はそれをより適切に処理しpushshiftlength、 などの便利な属性を提供します。さらに、将来の開発者は実際に何をしているのかを知ることができます。キーと値のペアを保存するだけの場合は、余分な重みで行き詰まらないため、オブジェクトが適しています。

つまり、どちらもキーと値のペアをサポートしていますが、舞台裏では大きく異なります。あまり気にせず、目の前の仕事に適した方を使用してください。

于 2012-08-23T18:31:00.430 に答える
0

Using{}は、Javascript のすべての複合型の基礎となるオブジェクトです。配列をオブジェクトのように扱うことができる理由は、Javascript では配列オブジェクトであるためです(ただし、その逆ではありません)。

Javascript の角括弧は、オブジェクトの属性にアクセスする方法であり.、C、Java、Python などの表記法とよく似ています。配列が属性 0、1、2 などに値を持っているのはたまたまです。配列には全体もあります。lengthshiftpushなどの他の組み込み属性の束。

これは確かに単純化しすぎていますが、何が起こっているのかを理解する簡単な方法です。

于 2012-08-23T18:31:00.747 に答える
0

配列はオブジェクトですが、オブジェクトは (常に) 配列ではありません。配列には、すべてのオブジェクトに存在しないメソッドとプロパティがあります

[].length //0
{}.length //undefined
typeof []['slice'] //function
typeof {}['slice'] //undefined

配列をハッシュマップとして使用し、すでに存在するものをキーとして使用しようとすると、問題が発生します

于 2012-08-23T18:36:19.013 に答える
0

[]は配列{}用で、プレーン オブジェクト用です。配列は、リストをモデル化できる多数のメソッドとプロパティを持つオブジェクトであることに注意してください(たとえば、プッシュ、スライスなど)。

MDN ドキュメントで指摘されているように、配列を連想配列として使用しないでください。つまり、配列をハッシュ テーブルとして使用しないでください。

于 2012-08-23T18:36:48.433 に答える
-1

1arrayつ目は 、2 つ目はliteral object:

var a = {};
a.SomeProperty = 1;

console.log(a.SomeProperty);

var b = [];
b['SomeProperty'] = 2;

console.log(b['SomeProperty']);

これにより、コンソール ログに出力1されます。2

For hashing, use an array(間違い) さん、コメントありがとうございます。

于 2012-08-23T18:28:38.590 に答える