【问题标题】:Why array in JavaScript showing wrong length为什么 JavaScript 中的数组显示错误的长度
【发布时间】:2012-11-11 04:07:55
【问题描述】:

我正在学习 Javascript。作为学习的一部分,我遇到了以下场景,我希望 a1.length(代码的最后一行)显示 201,但它显示 101,有什么想法吗?

var a1 = new Array();

for (var i = -100; i<=100; i++)
 a1[i]  = i;

for (var i in a1)
{
    document.write(i + "=" + a1[i])
    document.write("<br>");
}

document.write(a1.length);

【问题讨论】:

  • .length 中计数的数组索引从 0 开始。负索引被认为是对象的属性,而不是数组值。
  • 这就澄清了。谢谢 jfriend00。
  • 使用for (var i in a1) 遍历数组是非常不合适的。永远不要使用这种循环来遍历数组 - 始终使用 for(var i = 0; i &lt; arr.length; i++) 并避免诸如负索引之类的事情。根据定义,数组的元素从 0length-1
  • 您永远不需要数组上的负索引。查看this question 了解替代策略

标签: javascript


【解决方案1】:

我会将我的原始评论转换为更全面的答案。

.length 中计数的数组索引从0 开始向上。负索引被认为是对象的属性,而不是数组值。正如您从下面的 ECMAScript 规范中看到的那样,数组索引本质上只是某些经过特殊处理的属性值类型。

来自ECMAScript spec 的第 15.4 节:

15.4 数组对象

数组对象对特定类别的属性名称给予特殊处理。当且仅当 ToString(ToUint32(P)) 等于 P 且 ToUint32(P) 不等于 2^32 时,属性名称 P(以字符串值的形式)是数组索引。属性名称为数组索引的属性也称为元素。每个 Array 对象都有一个长度属性,其值始终是小于 2^32 的非负整数。 length 属性的值在数值上大于名称为数组索引的每个属性的名称;每当创建或更改 Array 对象的属性时,都会根据需要调整其他属性以保持此不变性。具体来说,每当添加名称为数组索引的属性时,如果需要,长度属性会更改为比该数组索引的数值大一;并且每当更改长度属性时,所有名称为数组索引且值不小于新长度的属性都会被自动删除。此约束仅适用于 Array 对象的自身属性,不受可能从其原型继承的长度或数组索引属性的影响。


另外,你永远不应该"iterate" arrays with a for-in-loop

for (var i in a1)

这会迭代 a1 的所有可枚举属性,这将包括所有数组索引,但也可能包括其他属性。如果你只想用for循环迭代数组元素,你应该使用另一种形式:

for (var i = 0, len = a1.length; i < len; i++) 

打字稍微多一些,但更安全。

或者,在更现代的浏览器中,您可以使用.forEach() method

【讨论】:

    【解决方案2】:

    这是因为 Javascript 中的数组是 zero-based,即它们从零开始,一直到 length - 1

    你通常编写你的 for 循环来由小于运算符绑定,如下所示:

    for(i = 0; i < arr.length; i++) {
        // do something with arr[i]
    }
    

    【讨论】:

      【解决方案3】:

      数组长度定义为最后一个元素的索引加一。数组不需要是连续的,这会产生奇怪的结果:

      var myArray = [];
      myArray[-42] = 1
      myArray[1000] = 2;
      document.write(myArray.length); // 1001
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-07
        相关资源
        最近更新 更多