JavaScript数组长度问题

JavaScript array length issue

本文关键字:问题 数组 JavaScript      更新时间:2023-09-26

我对以下内容有点困惑:

当我对两个不同的数组执行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);

第二个日志消息不能输出数组的长度,因为值已经分配给它的属性而不是它的索引,因为在数组的实际索引中没有对象(length属性是0)。这是因为数组不能包含非数字索引,如A、B、C、d。

所以当你执行:

var arr= [];
arr["b"] = "test";

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

Array对象的长度就是它的最高数值索引加1。第二个对象没有数字索引,因此其长度为0。

如果它是[ A: Object, B: Object, C: Object, 15: Object ],那么它的长度将是16。length的值与实际属性的数量无关(在本例中为4)。