javascript中associative [],{}和object之间的区别

时间:2013-01-26 15:11:55

标签: javascript

  

可能重复:
  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}

以上所有三个案例都提供相同的reault,因为它们都提供了一个对象。问题是如何用javascript处理上述3个案例。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

在您的示例中,bc基本相同,因为{}相当于new Object()

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

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

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

<强>琐事

根据ECMAScript documentation,当且仅在以下情况下,特定值p才能是数组索引:

length

另见:

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

答案 2 :(得分: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对象在控制台中看起来像Arrays的原因。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

first is an array
second is an object array
third is an array object