Javascript数组声明:new Array(),new Array(3),['a','b','c']创建行为不同的数组

时间:2011-11-23 17:19:49

标签: javascript arrays syntax

考虑这个示例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"]

我的问题是:

  1. 我是否正确使用数组['key'] ='value'语法?
  2. 为什么数组b没有按预期工作?
  3. 为什么数组a和c在控制台中的显示方式不同?似乎jQuery无法使用它的.each()方法迭代数组a。
  4. 你能推荐一些关于Javascript数组行为的好教程吗?
  5. 注意: Google Chrome的Firebug仅显示数组'a'的[],但无法展开它。

    编辑:好吧,似乎Javascript中的数组只有数字键,因此添加一个字符串作为键名会使一个对象脱离数组。但是为什么jQuery的.each不能使用它呢?

    $.each(a, function ()
        {
        alert ('derp');
        })
    

    此代码附加到脚本中,不会产生任何警报。

2 个答案:

答案 0 :(得分:56)

数组有数字索引。所以,

a = new Array();
a['a1']='foo';
a['a2']='bar';

and

b = new Array(2);
b['b1']='foo';
b['b2']='bar';

不是向数组添加元素,而是向.a1对象添加.a2a属性(数组也是对象)。作为进一步的证据,如果你这样做:

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/a2b1/b2是其数组中的关联对象,因此只能通过console.log(a.a1, a.a2)种语法记录它们