【问题标题】:Why does this return a 0 length? [duplicate]为什么这会返回 0 长度? [复制]
【发布时间】:2014-01-11 01:48:54
【问题描述】:

在控制台上,我尝试创建一个循环数组,我相信如果尝试遍历它会导致堆栈溢出,但我什至无法获得它的长度。

var a = [];
a['b'] = a;

a.length;
// 0

a['c'] = c;
a.length; 
// 0

【问题讨论】:

标签: javascript arrays


【解决方案1】:

它具有0length,因为数组length 属性返回的数字比最高数字 索引高一。

如果你这样做,你会得到length1

var a = [];
a[0] = a;
a.length; // 1

您可以将带有字符串键的属性分配给数组,它会“工作”,因为数组是对象并且可以具有额外的属性,但只有数字(整数)索引的属性参与数组行为,如 .length 或 @987654330 @。如果你想使用字符串键,你应该使用一个普通的对象:

var a = {};

(Plain) 对象没有length(除非您自己创建属性),但您可以使用Object.keys(a).length 来获取属性的数量(如果您不关心 IE .keys() - 虽然有一个polyfill)。

【讨论】:

    【解决方案2】:

    因为您没有将项目添加到数组中,所以您正在创建对象的属性。

    查看a.b中的内容

    【讨论】:

      【解决方案3】:
      var a = [];
      a['b'] = a;
      
      a.length;
      // 0
      
      a['c'] = c;
      a.length; 
      // 0
      

      Javascript 中的数组只允许数字作为元素键。

      您可以简单地更改密钥。

      var a = [];
      a[0] = a;
      a.length == 1
      

      或者使用地图对象而不是数组。

      var a = {};
      a['b'] = a;
      Object.keys(a).length == 1
      

      【讨论】:

        【解决方案4】:

        JS 中的数组被认为是索引数组。即

        var arMyArray = [];
        

        创建一个索引数组,可以引用为arMyArray[0], arMyArray[1]等。

        对于关联数组,您必须使用对象

        var oMyArray = {};
        

        创建一个对象,可以引用为oMyArray['name'] = 'aliasm2k'等。

        【讨论】:

          【解决方案5】:

          您编写的语句a['b'] = a 实际上等于a.b = a,这意味着您在a 上创建了一个名为b 的属性,并将自己分配给新创建的属性b,因此您最终得到了一个循环引用:a.b.b.b.b.b.b.b.b...b == a。你可以看看这个,它返回true。

          恐怕您可能错过了数组是可以具有如上所示属性的对象。为了使其行为像数组一样,元素以这种方式添加,例如a[0] = 1。因为您在创建的数组 a 上添加了对象属性,而不是作为元素添加,所以数组 a 为空,这就是 a.length 为 0 的原因。

          【讨论】:

            【解决方案6】:

            来自ECMAScript 5.1 Spec

            数组对象对某一类属性给予特殊处理 名字。属性名称 P(以字符串值的形式)是一个数组 index 当且仅当 ToString(ToUint32(P)) 等于 P 并且 ToUint32(P) 不等于 2^32 - 1.

            换句话说,数字属性名称被视为数组索引,而非数字属性名称不是。

            此外,

            长度属性的值在数值上大于名称 名称为数组索引的每个属性

            这意味着即使我有一个元素,长度也将取决于该单个元素的数组索引。具体来说,它总是比最大​​数组索引大一。

            例如:

            var list = [];
            list[5] = "Hello World";
            console.log(list.length); // Outputs 6!
            

            这也称为稀疏数组。如果您是 JavaScript 新手,那就有点奇怪了。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-07-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-09-25
              • 2017-06-13
              • 1970-01-01
              相关资源
              最近更新 更多