JavaScript数组长度问题

时间:2014-07-25 15:13:08

标签: javascript arrays

我对以下内容感到有些失落:

当我做一个两个不同阵列的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);

2 个答案:

答案 0 :(得分:3)

第二条日志消息无法输出数组的长度,因为已将值分配给其属性而不是其索引,因为数组的实际索引中没有对象length属性为{ {1}}。发生这种情况是因为数组不能包含非数字索引,例如A,B,C,D。

所以当你执行:

0

代码实际上是将字符串文字测试分配给var arr= []; arr["b"] = "test"; 数组的b属性而不是索引。这是可能的,因为数组是Javascript中的对象,因此它们也可能具有属性。

答案 1 :(得分:1)

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

如果是[ A: Object, B: Object, C: Object, 15: Object ],则其长度为16. length的值与实际属性的数量无关(在这种情况下为4)。