3

可能重复:
数组和对象有什么区别?
该项目存在于数组中,但它表示该数组的长度为 0?

我对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 中处理以上 3 种情况。

4

5 回答 5

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
于 2013-01-26T15:24:15.813 回答
1

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

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

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

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

琐事

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

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

也可以看看:

该项目存在于数组中,但它表示该数组的长度为 0?

于 2013-01-26T15:16:03.183 回答
1

让我们首先澄清一些事情:

new Object()是相同的{}

new Array()是相同的[]

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

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

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

于 2013-01-26T15:28:15.890 回答
0

请阅读以下文章 - <a href="http://www.2ality.com/2012/12/arrays.html" rel="nofollow">http://www.2ality.com/2012/12/arrays .html

简而言之,在 JavaScript 中表示的“常规数组”也是[]对象,就像或等等。{}length__proto__Array.prototypeArraypushforEach

于 2013-01-26T15:21:39.157 回答
0
first is an array
second is an object array
third is an array object
于 2013-01-26T15:58:11.937 回答