JavaScript数组长度问题

3

我对以下内容有些困惑:

当我使用console.log输出两个不同的数组时,其中一个给出了实际长度,而另一个则没有。

第一个数组的输出,长度正确:

[Object, Object, Object]
  0: Object
  1: Object
  2: Object
  length: 3
  __proto__: Array[0]

第二个的输出,长度应该是4,但实际上是0:

[A: Object, B: Object, C: Object, D: Object]
  A: Object
  B: Object
  C: Object
  D: Object
  length: 0
  __proto__: Array[0]

为什么我的第一个数组有正确的长度,但第二个数组没有?
编辑:这是生成上述输出的代码:
var links = [
  {source: "A", target: "B"},
  {source: "A", target: "C"},
  {source: "A", target: "D"}
];

var nodes = [];

// Compute the distinct nodes from the links.
links.forEach(function(link) {
  link.source = nodes[link.source] || (nodes[link.source] = {name: link.source});
  link.target = nodes[link.target] || (nodes[link.target] = {name: link.target});
});

console.log(links);
console.log(nodes);

1
你有能够重现这个问题的代码示例吗? - Patrick Hofman
4
第二个是一个对象,数组不能有字符作为索引,只有对象可以。 - adeneo
2
@MarkReed 数组可以拥有属性(它们不算作索引元素);请参见Kevin的回答中的讨论。 - Evan Davis
1
@Prusse:没有。那看起来像是控制台显示。 - cookie monster
1
所以这是一些奇怪的显示符号,而不是代码中的有效文字。多么...有用。好的。 - Mark Reed
显示剩余14条评论
2个回答

4
第二条日志信息无法输出数组的长度,因为值被分配给了其属性而不是索引,由于实际索引中没有对象,所以length属性为0。这是因为数组不能包含非数字索引,例如A、B、C、D。
因此,当您执行以下操作时:
var arr= [];
arr["b"] = "test";

代码实际上是将字符串 test 分配给 arr 数组的 b 属性,而不是索引。这是可能的,因为在 Javascript 中数组是对象,所以它们也可以有属性。

嗯,不完全准确。Array继承自Object,但仍然可以拥有属性。AB等是数组的属性。例如,.push()仍然可以使用。 - Evan Davis
@Mathletics 我认为这应该被视为属性,而不是数组中的索引对象。 - Kevin Bowersox
没错,那正是我说的。然而,被记录的项目仍然是一个数组,只是没有任何元素。 - Evan Davis
1
所有的数组都是对象,所以从技术上讲,你是正确的,向对象添加其他属性没有问题,但是数组是预定义的对象,它们有一个长度和一种特定的方式来添加和读取数据,随意添加属性很可能不是一个好主意,也不是 OP 所试图做的。 - adeneo
@Mathletics 感谢您纠正我,最近我一直在Java世界里,对JS的机制有点生疏了。 - Kevin Bowersox
显示剩余2条评论

1
一个数组对象的长度仅仅是它最高的数字索引加一。第二个对象没有数字索引,所以它的长度为0。
如果它是 [ A: Object, B: Object, C: Object, 15: Object ],那么它的长度将会是16。length的值与实际属性的数量(在这种情况下为4)无关。

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