【问题标题】:JavaScript array length issue [duplicate]JavaScript数组长度问题[重复]
【发布时间】:2014-09-17 11:58:24
【问题描述】:

我对以下内容有点迷茫:

当我对两个不同的数组进行 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 of JavaScript Object Array
  • 第二种语法应该是什么鬼? [...] 用于没有键的数组; {...} 用于对象,可以。
  • @MarkReed 数组可以有属性(它们不算作索引元素);请参阅有关凯文回答的讨论。

标签: javascript arrays


【解决方案1】:

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

所以当你执行时:

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

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

【讨论】:

  • 呃,不完全是。 Array 扩展 Object 但仍然可以拥有属性。 AB 等是数组上的属性。例如,.push() 仍然可以工作。
  • @Mathletics 我认为这是一个属性,而不是数组中的索引对象。
  • 对,我就是这么说的。然而,被记录的项目仍然是一个数组,它只是没有任何元素。
  • 啊,明白了,所以如果你正在记录一个数组,你就是通过原型继承记录一个对象。技术细节... :)
  • 所有数组都是对象,所以从技术上讲你是对的,给对象添加其他属性并没有错,但是数组是预定义的对象,它们有长度和特定的添加和读取数据的方式,仅仅坚持随机属性很可能不是一个好主意,也不是 OP 想要做的。
【解决方案2】:

Array 对象的长度就是它的最高数字索引加一。第二个对象没有数字索引,所以它的长度是 0。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2020-03-24
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    相关资源
    最近更新 更多