Array.length gives incorrect length

后端 未结 4 1910
我在风中等你
我在风中等你 2020-12-03 16:41

If I have an array having object as values at the indices like:

var a = [];
a[21] = {};
a[90] = {};
a[13] = {};
alert(a.length); // outputs 91
4条回答
  •  攒了一身酷
    2020-12-03 17:30

    That's because length gives you the next index available in the array.

    DOCS

    arrayLength

    If the only argument passed to the Array constructor is an integer between 0 and 2^32-1 (inclusive), this returns a new JavaScript array with length set to that number.

    ECMA Specifications

    Because you don't have inserted any element in the other keys than 21, 90, 13, all the remaining indexes contains undefined. DEMO

    To get actual number of elements in the array:

    var a = [];
    a[21] = {};
    a[90] = {};
    a[13] = {};
    
    var len = 0;
    
    for (var i = 0; i < a.length; i++) {
      if (a[i] !== undefined) {
        len++;
      }
    }
    document.write(len);

    Shorter version

    var a = [];
    a[21] = {};
    a[90] = {};
    a[13] = {};
    
    
    for (var i = 0, len = 0; i < a.length; i++, a[i] !== undefined && len++);
    
    
    document.write(len);

    DEMO

    EDIT

    If the array contains large number of elements, looping to get its length is not the best choice.

    As you've mentioned in the question, Object.keys(arr).length is the best solution in this case, considering that you don't have any properties added on that array. Otherwise, the length will not be what you might be expecting.(Thanks To @RobG)

提交回复
热议问题