javascript中关联[]、{}和对象之间的差异

javascript中关联[]、{}和对象之间的差异,javascript,Javascript,可能重复: 我对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} 以上三种情况给出的结果都与它们给出的对象相同。问题是如何在ja

可能重复:

我对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}

以上三种情况给出的结果都与它们给出的对象相同。问题是如何在javascript中处理上述三种情况。

在您的示例中,
b
c
本质上是相同的,因为
{}
相当于
新对象()

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

当您使用
'A'
作为索引时,它会被视为常规属性,由
对象
如何处理属性定义,因此您可以将其作为
A.A
A['A']
访问,而
[5]
的索引只能使用
A[5]
访问

通常,数组的调试输出总是
[]
,除非
length
属性为非零,因此显示的输出有点不规则

琐事

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

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


请阅读以下文章-


简言之,“规则数组”,在JavaScript中表示为
[]
,也是对象,就像
{}
,但它们有
长度
属性和“数字”键(“标记”),加上它们内部
\uuuuu proto\uuuu
属性点位于
数组。prototype
对象,它包含所有
数组
方法,例如
push
forEach
等。

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

var a = [];
a[42] = 1337;
数组和对象之间的区别在于,数组将带有数字索引的属性作为数组数据的一部分进行计数,并相应地更新
length
属性。(另外,数组对象有一些特定的方法来处理数组数据。)

现在,长度已更改为包含项目:

alert(a.length); // shows 43
使用字符串或数字作为索引并不重要,数字索引即使是字符串也会计数:

alert(a[42]); // shows 1337
alert(a["42"]); // shows 1337
缩短长度将删除其外部的属性:

a.length = 10;
alert(a[42]); // shows undefined

让我们从澄清一些事情开始:

newobject()
{}

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

Chrome将把任何具有数字长度属性和拼接功能的东西作为一个数组。这就是为什么jQuery对象在控制台中看起来像数组。

我怀疑第一个对象是否给出
{A:1}
。在我的控制台中,它给出了一个空的
[]
数组(应该是)。@VisioN:我正在IE中检查它。在IE中,它给出了上面的结果,而不管控制台说什么,
a
将有一个
a
属性,因为数组也是对象。数组只是特殊对象。对象的处理方式与其他对象完全相同,但它们以特殊的方式处理具有数字名称的属性。始终只使用带有数字键的数组,一切都会正常;)@FelixKling Numeric但不是negative:)那么问题应该重新表述为“为什么IE先验地给出错误语法的错误结果?”。数组元素只不过是具有数字属性名称的属性,所以“它改为属性”这句话有点误导。@是的,我不得不承认这有点奇怪。@FelixKling谢谢你强调这一点,更新了我的答案:)
first is an array
second is an object array
third is an array object
first is an array
second is an object array
third is an array object