Javascript数组声明:new array()、new array(3)、[';a';、';b';、';c';]创建行为不同的数组
考虑以下示例Javascript代码: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
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"]
我的问题是:
$.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';