【问题标题】:Difference between associative [],{} and object in javascript [duplicate]javascript中关联[],{}和对象之间的区别[重复]
【发布时间】:2013-01-10 09:16:11
【问题描述】:

可能重复:
What is the difference between an array and an object?
The item exists in the array but it says that the array is 0 length?

我对 javascript 中的对象和关联数组有点困惑。我读了这个:question,但这个问题说两者没有太大区别。我在控制台中写了这个:

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}

以上三种情况都给出了相同的结果,因为它们都给出了一个对象。问题是如何在javascript中处理以上3种情况。

【问题讨论】:

  • 我怀疑第一个是否给出{A : 1}。在我的控制台中,它给出了一个空的 [] 数组(应该是这样)。
  • @VisioN :我在 IE 中检查它。在即它给了我上面的结果
  • 不管控制台说什么,a 都会有一个A 属性,因为数组也是对象。
  • 数组只是特殊的对象。其处理方式与其他对象完全相同,但它们以特殊方式处理具有数字名称的属性。始终只使用带有数字键的数组,一切都会好起来的;)
  • @FelixKling 数字但不是负数:)

标签: javascript


【解决方案1】:

在您的示例中,bc 本质上是相同的,因为 {} 等同于 new Object()

回到a,它被定义为Array,这是一种特殊的Object,因为数字属性(基于uint32)的处理方式不同。它的length 属性会在添加和删除这些属性时更新。

当您使用'A' 作为索引时,它会被视为常规属性,由Object 如何与属性一起使用定义,因此您可以将其作为a.Aa['A'] 访问,而@987654335 的索引@ 只能使用a[5] 访问。

通常,数组的调试输出始终为 [],除非 length 属性不为零,因此您显示的输出有些不规则。

琐事

根据ECMAScript documentation,特定值p只能是数组索引当且仅当:

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

另见:

The item exists in the array but it says that the array is 0 length?

【讨论】:

  • 那么问题应该重新表述为“为什么 IE 先验地为错误的语法给出错误的结果?”。
  • 数组元素只不过是具有数字属性名称的属性,因此“它变成了属性”这句话有点误导。
  • @VisioN 是的,我不得不承认这有点奇怪。
  • @FelixKling 感谢您强调这一点,更新了我的答案:)
【解决方案2】:

请阅读以下文章——http://www.2ality.com/2012/12/arrays.html

简而言之,“常规数组”,在 JavaScript 中表示为 [],也是对象,就像 {},但它们具有 length 属性和“数字”键(“indicies”),以及它们的内部__proto__ 属性指向Array.prototype 对象,该对象包含所有Array 方法,例如pushforEach 等。

【讨论】:

    【解决方案3】:

    数组也是一个对象,这就是为什么你也可以使用非数字索引。这些将作为属性添加到数组对象,而不是数组数据的一部分。

    数组和对象之间的区别在于,数组将具有数字索引的属性计数为数组数据的一部分,并相应地更新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
    

    【讨论】:

      【解决方案4】:

      让我们先澄清一些事情:

      new Object(){} 相同

      new Array()[] 相同

      后者只是前者的缩写形式。

      在幕后,javascript 中的一切基本上都是一个对象(这有点夸张但相当准确)。数组只是从对象派生而来。这是一个数组 REALLY 的基本示例:

      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 对象在控制台中看起来像数组。

      【讨论】:

        【解决方案5】:
        first is an array
        second is an object array
        third is an array object
        

        【讨论】:

          猜你喜欢
          • 2015-12-16
          • 2016-04-20
          • 1970-01-01
          • 1970-01-01
          • 2010-10-06
          • 2015-09-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多