【问题标题】:Difference between var = {} and var = []? [duplicate]var = {} 和 var = [] 之间的区别? [复制]
【发布时间】:2012-08-23 18:24:55
【问题描述】:

可能重复:
Objects vs arrays in Javascript for key/value pairs

我在 JavaScript 中有一个变量,我像 hash 一样使用它。我可以像这样初始化它:

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

真的有区别吗?一个是 object 而另一个是 array 吗?如果是这样,我应该什么时候遇到问题。即,两者在用法上有什么区别,为什么要选择一个而不是另一个?

【问题讨论】:

标签: javascript


【解决方案1】:

[] 是一个数组,{} 是一个对象。数组是一种旨在仅分配数字键的对象。

虽然理论上您可以互换使用它们,但看看 JSON 化它们会发生什么:

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

// array:
'[]'

// object:
'{"one":1}'

【讨论】:

    【解决方案2】:

    数组 ([]) 是一种 对象 ({})。主要区别在于:

    • 数组有一个神奇的length 属性,它等于最高设置的数字键(加一):

      var a = [];
      a[100] = 0;
      a.length; // is 101
      
      var o = {};
      o[100] = 0;
      o.length; // is undefined
      
    • Array 的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"]
      

    【讨论】:

      【解决方案3】:

      是的,{} 是一个空对象,[] 是一个空数组。请注意,数组 一种对象,经过优化以处理值列表,但是,与任何 Javascript 对象一样,它可以接受其他属性,例如 "one""two" — 这就是它的方式可以支持myArray.push(1)之类的方法:push是所有数组的一个属性。事实上,你甚至可以说 myArray["push"] = someOtherFunction 来覆盖 push 没有任何麻烦。与所有 Javascript 对象一样,数组支持任意键值分配。

      不过,归根结底,这与幕后表演有关。如果您希望存储一个连续的值列表,该数组会更好地处理它并提供一些有用的属性,例如pushshiftlength 等。另外,未来的开发人员实际上会知道您的内容正在做。如果您只想存储键值对,那么对象就是您要走的路,因为它不会被所有额外的重量所困扰。

      简而言之,虽然它们都支持键值对,但它们在幕后却大不相同。不要太担心它,使用更适合手头工作的那个。

      【讨论】:

        【解决方案4】:

        使用{} 是一个对象,它是Javascript 中每个复杂类型的基础。您可以将数组视为对象的原因是因为在 Javascript 中,数组一个对象(但不是相反)。

        Javascript 中的方括号是您访问对象属性的方式,很像 C、Java、Python 等中的 . 表示法。恰好数组在属性 0、1、2 等处具有值. 数组还有一大堆其他内置属性,如lengthshiftpush 等。

        这肯定是过于简单化了,但它是理解发生了什么的简单方法。

        【讨论】:

          【解决方案5】:

          一个数组是一个对象,但一个对象不是(总是)一个数组。 数组具有并非每个对象都存在的方法和属性 示例

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

          如果你使用数组作为 hashmap 并尝试使用已经存在的东西作为键,你会遇到麻烦

          【讨论】:

            【解决方案6】:

            [] 用于数组,{} 用于普通对象。请注意,array 是一个具有多个 methods 和允许对列表建模的属性(例如 push、slice、...)的对象。

            正如 MDN 文档中指出的那样,you shouldn't use an array as an associative array,即数组不能用作哈希表。

            【讨论】:

              【解决方案7】:

              第一个是array,第二个是literal object

              var a = {};
              a.SomeProperty = 1;
              
              console.log(a.SomeProperty);
              
              var b = [];
              b['SomeProperty'] = 2;
              
              console.log(b['SomeProperty']);
              

              这将在控制台日志中输出12

              For hashing, use an array错误),感谢您的评论。

              【讨论】:

              • -1 表示“对于散列,使用数组”
              • 这是为什么呢?我实际上对你的回答很感兴趣,因为我一直在做这件事。
              • 数组最适合用于数字索引存储 (var a = []; a[0] = 1;)。如果你想要一个哈希,一个数组只能提供一个简单的对象 (var a = {}; a['prop'] = 1;) - 它甚至可能有你可能没想到的缺点(比如 Kolink 答案中的 JSON 表示)。
              猜你喜欢
              • 2013-02-19
              • 1970-01-01
              • 2017-01-21
              • 1970-01-01
              • 2014-03-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多