JavaScript中对象和关联数组的区别是什么?

8

令人困惑的讨论

在这个问题中,有关于JavaScript中关联数组和对象概念的讨论,我感到有点困惑。

在下面的示例代码中:

var check = {
  pattern : {
    name: /^[a-zA-Z-\s]{1,20}$/,
    email: /^[a-zA-Z0-9._(-)]+@[a-zA-Z0-9.(-)]+\.[a-zA-Z]{1,4}$/,
    pass: /.{6,40}/,
    url:  /^[(-)\w&:\/\.=\?,#+]{1,}$/,
    aml:  /<(.+)_([a-z]){1}>$/
    }
};

这里的讨论让我感到困惑:

@steven.yang 在你的示例中,外部对象不是关联数组,但这就是所要求的。

@sissonb 你说的'外部对象不是关联数组'是什么意思?我认为在javascript中,关联数组被表示为对象。区别在于表示法-可以用 foo.barfoo[bar]

@steven.yang 关联数组指的是键=>值。 http://en.wikipedia.org/wiki/Associative_array 你的内部对象有一个名为pattern的键,包含这个关联数组的对象没有键。

我对JS中关联数组和对象的理解

关联数组是以键值对形式定义的数据结构,在JavaScript中以对象表示。

分配给check的外部对象具有pattern键和另一个对象的值。内部对象具有nameemail等键和对应的正则表达式对象的值。

这两个对象都可以视为关联数组吗?


1
JavaScript 中的关联数组就是使用数组语法的对象。 - david
5个回答

7
不完全是,原因如下:
var arr = new Array();
arr["foo"] = 100;
arr["bar"] = 200;
console.log(arr.length); // Prints 0.

将元素添加到关联数组中应该增加它的长度(在我看来)。

由于语法糖,它看起来和行为上有些类似于关联数组。然而,看起来像“数组条目”的东西实际上只是对象属性。


1
请给我找一个关于关联数组的定义,其中明确说明它们必须具有长度。 - Raynos
2
维基百科文章中未提及大小或长度。 - Raynos
1
@nnnnnn 我不在乎长度是计算的还是属性。C 期望开发人员管理数组长度,这很好。它也不是面向对象的,所以我不会期望任何数据结构具有属性,除了开发人员提供的属性。JS 一种面向对象编程语言,因此我希望结构具有有意义的属性。在我看来,关联数组应该有一个有意义的“length”属性,并且迭代应该按照我的预期进行。再次强调-这只是我的观点;在宏观层面上并没有什么意义 :) - Dave Newton
1
我选择这个答案是因为以下讨论评论澄清了关联数组和对象的混淆。 - steveyang
2
@steven.yang 我想我更加困惑了 ;) - Dave Newton
显示剩余17条评论

6
如果你将“关联数组”定义为一种数据结构,用于将信息存储为键值对的集合,则 JavaScript 对象是关联数组。然而,“关联数组”这个词组通常不在 JavaScript 的上下文中使用,我们更常说“对象”。我建议遵循标准的 JS 术语以避免误解。请注意,JS 还有(非关联的)数组,可以通过数字索引访问元素。这些也是对象,因此允许非数字键属性,但这通常被认为是不好的做法。

只要它是非数字索引,它就是一个对象属性,就像任何其他对象一样。 - Dave Newton
@DaveNewton 数字索引也是对象属性。 - Raynos
@Raynos 但它们是不同的——使用数字索引确实会增加数组大小,而属性则不会。 - Dave Newton
@DaveNewton 这并不意味着它们不是对象属性。这只是意味着 Array 在内部的 [[DefineOwnProperty]] 属性上施展了魔法,以确保 length 正确。具体来说,参见 ES5.1 15.4.5.1 第四步,其中检查该属性是否为“数组索引”。 - Raynos
@Raynos 但我不关心语义。我关心的是满足我的期望。JS对象不能满足我对关联数组的期望,所以我不认为它们以一种有意义的方式是关联数组。理性的人可能会有不同的看法:我们有分歧,我可以接受。你知道我的理由-我相信它们是有效的,而你则不同意。没什么好说的了。 - Dave Newton

3

JavaScript中没有关联数组。一切都是对象。

当然它们很相似,但JavaScript中的关联数组只是对象。


3
对象为什么不是关联数组?它们在哪个定义下无法成为关联数组? - Raynos
@Raynos 遍历关联数组的成员应该只返回关联数组的元素。但是对于对象及其属性来说并非如此。 - Dave Newton
术语...当然你可以说在JavaScript中associativeArray = Object和Object = associativeArray,但在我看来它们都只是Object。 - John Hartsock
@JohnHartsock 一切都是双重的 ;) - Raynos
-1 因为没有提供支持这些主张的证据,其他人对此表示反对。 - hippietrail
显示剩余4条评论

3

关联数组

在计算机科学中,关联数组(也称为映射或字典)是一种抽象数据类型,由一组(键,值)对组成,使得集合中的每个可能的键最多只出现一次。

据我所知,JavaScript 中的对象符合该定义。

当然,并没有独特的“关联数组”对象,它与任何其他普通对象都没有不同。因此,如果您想要使用关联数组功能,请使用 JavaScript 对象。

然而,以下是一个常见的错误信息

JavaScript 中没有关联数组

您应该简单地忽略这些人,也许试图说服他们错了。


2
我并不是在批评你的帖子,也没有给它投票。我只是提出了一个增强建议。我认为人们会在javascript中感到困惑,因为他们期望有一种名为"关联数组"的数据类型,并且没有意识到对象具有所有这些功能。然后,他们使用一个"数组",当.length仍然为零时,即使他们已经向数组中添加了项,他们会更加困惑。 - jfriend00
1
@TimDown 嗯,如果人们没有标准化的术语定义,那会很烦人。如果我要求一个苹果,而你给我一个橙子,然后坚持认为橙子就是苹果,我会暴怒的。 - Raynos
@Raynos 你为什么坚持把对象称作关联数组?是因为像PHP这样的旧语言吗?这不是一个好的理由。(*我已经为你的答案点赞了) - c69
1
@c69 因为它符合关联数组的定义。 - Raynos
@Raynos 是的,它们是同义词,但“关联数组”更长且过时。此外,将复杂的树形结构或循环结构称为“数组”是错误的 - 在日常js中经常看到这些情况。因为DOM是一个具有循环引用的深层树形结构。 - c69
显示剩余5条评论

0

我的回复有点晚,但我希望这可以帮助人们理解这个区别。我正在阅读这篇文章,但没有一个令人满意的关于关联数组的定义。

JavaScript 没有关联数组。这些只是对象,你可以将其视为方便的关联数组。在对象中,你将值存储为命名属性,非常类似于其他编程语言中的关联数组。这就是为什么你可以像使用关联数组一样访问属性,但是需要使用与对象相关的方法。你可以尝试创建一个对象并尝试所有你可以使用关联数组做的事情,但你不能做数组的所有方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接