考虑这个示例Javascript代码:
a = new Array();
a['a1']='foo';
a['a2']='bar';
b = new Array(2);
b['b1']='foo';
b['b2']='bar';
c=['c1','c2','c3'];
console.log(a);
console.log(b);
console.log(c);
Firebug控制台中的结果如下:
对于a('[]'必须通过点击'+'按钮扩展):
[]
a1 "foo"
a2 "bar"
对于b:
[undefined, undefined]
对于c:
["c1", "c2", "c3"]
我的问题是:
注意: Google Chrome的Firebug仅显示数组'a'的[],但无法展开它。
编辑:好吧,似乎Javascript中的数组只有数字键,因此添加一个字符串作为键名会使一个对象脱离数组。但是为什么jQuery的.each不能使用它呢?
$.each(a, function ()
{
alert ('derp');
})
此代码附加到脚本中,不会产生任何警报。
答案 0 :(得分:56)
数组有数字索引。所以,
a = new Array();
a['a1']='foo';
a['a2']='bar';
and
b = new Array(2);
b['b1']='foo';
b['b2']='bar';
不是向数组添加元素,而是向.a1
对象添加.a2
和a
属性(数组也是对象)。作为进一步的证据,如果你这样做:
a = new Array();
a['a1']='foo';
a['a2']='bar';
console.log(a.length); // outputs zero because there are no items in the array
你的第三个选择:
c=['c1','c2','c3'];
为变量c
分配一个包含三个元素的数组。这三个元素可以访问为:c[0]
,c[1]
和c[2]
。换句话说,c[0] === 'c1'
和c.length === 3
。
Javascript不会将其数组功能用于其他语言调用关联数组,您可以在其中使用数组中的任何类型的键。您可以通过在javascript中使用一个对象来实现关联数组的大部分功能,其中每个项目都只是这样的属性。
a = {};
a['a1']='foo';
a['a2']='bar';
将数组用于此目的通常是一个错误,因为它只会让读取代码的人感到困惑,并导致对代码如何工作的错误假设。
答案 1 :(得分:4)
JS中的数组有两种属性:
常规元素和关联属性(它们只是对象)
定义a = new Array()
时,您正在定义一个空数组。请注意,还没有关联对象
定义b = new Array(2)
时,您正在定义一个包含两个未定义位置的数组。
在你的两个例子中,' a'和' b',您正在添加关联属性,即对象到这些数组。
console.log (a)
或console.log(b)
分别打印数组元素,即[]
和[undefined, undefined]
。但由于a1/a2
和b1/b2
是其数组中的关联对象,因此只能通过console.log(a.a1, a.a2)
种语法记录它们