JavaScript数组长度问题

JavaScript数组长度问题,javascript,arrays,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:

我对以下内容有点迷茫:

当我对两个不同的数组执行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中的对象,因此它们也可能具有属性。

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


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

您是否有复制此值的代码示例?第二个是对象,数组不能有字符作为索引,只有对象可以。这可能有帮助:第二个语法到底应该是什么
[
..
]
用于没有键的数组
{
..
}
用于对象,对象有。@MarkReed数组可以有属性(它们不算作索引元素);看关于凯文答案的讨论。呃,不完全是<代码>数组扩展了
对象
,但仍然可以具有属性<代码>A、
B
等是阵列上的属性<代码> .PUTH()/代码>仍然有效,例如,@ MathLeTICE,我会考虑数组中的属性而不是索引对象。对,我就是这么说的。但是,要记录的项仍然是一个数组,它只是没有任何元素。啊,明白了,所以如果要记录数组,就要通过原型继承记录对象。技术细节…:)所有数组都是对象,所以从技术上讲你是对的,向对象添加其他属性没有错,但是数组是预定义的对象,它们有一定的长度和特定的方式来添加和读取数据,仅仅坚持随机属性很可能不是一个好主意,也不是OP想要做的。