可能重复:
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个案例。
答案 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)
在您的示例中,b
和c
基本相同,因为{}
相当于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
方法,例如push
或forEach
等。
答案 4 :(得分:0)
first is an array
second is an object array
third is an array object