我对以下内容感到有些失落:
当我做一个两个不同阵列的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);
答案 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)。