Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript数组声明:new array()、new array(3)、[';a';、';b';、';c';]创建行为不同的数组_Javascript_Arrays_Syntax - Fatal编程技术网

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

Javascript数组声明:new array()、new array(3)、[';a';、';b';、';c';]创建行为不同的数组,javascript,arrays,syntax,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(必须通过单击“+”按钮扩展“[]”): 对于b: [undefined, un

考虑以下示例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(必须通过单击“+”按钮扩展“[]”):

对于b:

[undefined, undefined]
对于c:

["c1", "c2", "c3"]
我的问题是:

  • 我是否正确使用数组['key']='value'语法
  • 为什么阵列b不能按预期工作
  • 为什么阵列a和阵列c在控制台中显示不同?另外,jQuery似乎无法使用其.each()方法遍历数组a
  • 你能推荐一些关于Javascript数组行为的好教程吗
  • 注意:谷歌Chrome的Firebug只显示[]数组“a”,没有扩展它的选项

    EDIT:好的,Javascript中的数组似乎只有数字键,因此添加字符串作为键名会使数组中的对象成为一个对象。但是为什么jQuery不能,每个都可以使用它呢

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

    此代码附加到脚本后不会生成警报。

    数组具有数字索引。所以

    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';
    

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

    JS中的数组有两种类型的属性:

    常规元素和关联特性(它们只是对象)

    定义
    a=new Array()
    时,定义的是空数组。请注意,还没有关联对象

    当您定义
    b=newarray(2)
    时,您定义的数组有两个未定义的位置

    在“a”和“b”的示例中,您都在向这些数组添加关联属性,即对象


    console.log(a)
    console.log(b)
    分别打印数组元素,即
    []
    [未定义,未定义]
    。但是由于
    a1/a2
    b1/b2
    是其数组中的关联对象,因此只能通过
    console.log(a.a1,a.a2)
    某种语法来记录它们

    您将JavaScript的数组对象与PHP等语言中可用的关联数组混淆了。JavaScript数组只使用数字索引。使用语法
    a['a1']=val
    将属性
    a1
    添加到对象
    a
    ,而不是数组值。@P.Brian.Mackey:可能是因为这类问题已经被问了很多次了。@exizt:Firebug和类似的工具会对您想要显示的内容做出假设。它们不一定是语言的完美代表,尽管如下所述,通常最好只依赖JavaScript数组中的数字属性。@RightSaidFred-那么你是说这个问题是重复的,但答案是新的吗?在这种情况下,什么才算是“研究”?你能告诉我应该使用什么搜索查询来找到正确答案吗?关于
    a
    b
    之间的区别,我认为它来自声明
    b=newarray(2)。这里你说的是“我的数字索引数组有2项”。既然你没有在
    b[0]
    b[1]
    中输入任何内容,这就解释了你在Firebug中遇到的2
    未定义的问题。我明白了,谢谢!但是为什么jQuery的.each()不能与“a”数组一起工作呢?(请参见编辑)注意firebug是如何将对象视为包含数组元素的对象的,这很有趣。但是,它将b视为一个没有可见属性的数组(尽管属性确实存在)。其中唯一的区别是传递给数组构造函数的参数。我想知道这是为什么?@exizt-jQuery的
    。每个()
    方法都必须尝试确定传递给它的项是对象还是数组,以便确定如何迭代它。如果它是一个数组,它将使用
    .each()
    迭代中的数组元素。在您的例子中,您给了它一个数组,因此它将其视为一个数组,但该数组在实际数组中没有元素,因此,没有需要迭代的内容。如果您更改为
    a={}作为初始化,然后它将与jQuery的
    一起工作。each()
    @jfriend在我的回答中澄清了我自己的疑问:P
    a = {};
    a['a1']='foo';
    a['a2']='bar';