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

sbi*_*nko 47 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);
Run Code Online (Sandbox Code Playgroud)

Firebug控制台中的结果如下:

对于a('[]'必须通过单击'+'按钮进行扩展):

[]      
a1  "foo"   
a2  "bar"
Run Code Online (Sandbox Code Playgroud)

对于b:

[undefined, undefined]
Run Code Online (Sandbox Code Playgroud)

对于c:

["c1", "c2", "c3"]
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

注意: Google Chrome的Firebug仅显示数组'a'的[],但无法展开它.

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

$.each(a, function ()
    {
    alert ('derp');
    })
Run Code Online (Sandbox Code Playgroud)

附加到脚本的此代码不会生成警报.

jfr*_*d00 59

数组有数字索引.所以,

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

and

b = new Array(2);
b['b1']='foo';
b['b2']='bar';
Run Code Online (Sandbox Code Playgroud)

不将元素添加到阵列中,但添加.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
Run Code Online (Sandbox Code Playgroud)

你的第三个选择:

c=['c1','c2','c3'];
Run Code Online (Sandbox Code Playgroud)

将变量赋给c一个包含三个元素的数组.这三个元素可以访问:c[0],c[1]c[2].换句话说,c[0] === 'c1'c.length === 3.

Javascript不会将其数组功能用于其他语言调用关联数组,您可以在数组中使用任何类型的键.您可以通过在javascript中使用一个对象来实现关联数组的大部分功能,其中每个项目只是这样的属性.

a = {};
a['a1']='foo';
a['a2']='bar';
Run Code Online (Sandbox Code Playgroud)

将数组用于此目的通常是错误的,因为它只会让读取代码的人感到困惑,并导致对代码如何工作的错误假设.

  • 关于`a`和`b`之间的区别,我认为它来自声明`b = new Array(2);`.在这里你说"我的数字索引数组有2项".既然你没有把任何东西放在`b [0]`和`b [1]`中,这就解释了你在Firebug中获得的2'undefined`. (2认同)