最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Length of Array Differs In Internet Explorer With Trailing Comma - Stack Overflow

programmeradmin1浏览0评论

I'm currently working with some data using Javascript that is in the form of an array. The array may contain an empty entry at the end, such as [1,2,]. In Google Chrome and Firefox, the length of that example would be 2; however, in IE, the length is 3.

In short: Internet Explorer is giving a different length for an array in Javascript than Google Chrome and Firefox. Is there a way to standardize this behavior across all browsers?

Code:

var a = [1,];
alert(a.length);

EDIT:

A lot of answers are saying not to have a trailing comma, however, the data is given to me in this way.

I'm currently working with some data using Javascript that is in the form of an array. The array may contain an empty entry at the end, such as [1,2,]. In Google Chrome and Firefox, the length of that example would be 2; however, in IE, the length is 3.

In short: Internet Explorer is giving a different length for an array in Javascript than Google Chrome and Firefox. Is there a way to standardize this behavior across all browsers?

Code:

var a = [1,];
alert(a.length);

EDIT:

A lot of answers are saying not to have a trailing comma, however, the data is given to me in this way.

Share Improve this question edited Feb 5, 2014 at 19:08 Ivan asked Jun 30, 2011 at 21:13 IvanIvan 10.4k12 gold badges48 silver badges79 bronze badges 4
  • possible duplicate of Javascript Browser Quirks - array.Length – mplungjan Commented Jun 30, 2011 at 21:27
  • @mplungjan: Definitely not a duplicate since I'm not just saying: "O look! A quirk!" I'm asking for a cross browser way to standardize the length. – Ivan Commented Jun 30, 2011 at 21:49
  • Which is given here - it also says "possible" ;) – mplungjan Commented Jul 1, 2011 at 7:43
  • See also IE9 JavaScript array initialization bug – Noyo Commented Jul 30, 2013 at 8:44
Add a comment  | 

3 Answers 3

Reset to default 18

NEVER have trailing commas in IE. Period.

That goes for ARRAYs too

Javascript Browser Quirks - array.Length

To handle your edit this works (tested in in IE8):

if (a[a.length-1]==null) a.length--; // or a.pop()

For a safer test, please look at the other suggestion on this page: Length of Array Differs In Internet Explorer With Trailing Comma - DEMO HERE

By the way, never heard the words elision or elided before - learn something new here every day

No. IE incorrectly interprets a single trailing comma as an elision and adds one to the length when it shouldn't (ECMA-262 sect. 11.1.4).

Edit

To clear up the confusion here, IE treats a single trailing comma in an array literal (incorrectly) as an elision, which means it increments array's length property but does not create a property. In other words, given:

var a = [0,1,];

In IE, a.length is 3, but there is no property a[2]. So if an appropriate solution is to remove only elided members from the end of an array (which is likely the best solution if they are an issue), then:

function tidyTrailingElisions(array) {
  var i = array.length;
  while (!array.hasOwnProperty(--i)) {}
  array.length = ++i;
  return array;
}

will remove only elided members from the end of the array (that is, properties that don't exist), it will not remove them elsewhere, nor will it waste time iterating over the entire array (which can result in elided members being added as undefined). To add to Array.prototype:

Array.prototype.tidyTrailingElisions = function() {
  var i = this.length;
  while ( !this.hasOwnProperty(--i)) {}
  this.length = ++i;
  return this;
};

Note that this is how Array.prorotype.filter works, it doesn't iterate over elided members (it uses a hasOwnProperty test and removes any elided mebers as part of filtering the array).

Try removing empty elements:

a = a.filter(function(){return true});

Then it should work the same way in IE and other browsers.

Update: if the JS version is lower than 1.6, try this:

Array.prototype.clean = function() {
  for (var i = 0; i < this.length; i++) {
    if (this[i] == undefined) {
      this.splice(i, 1);
      i--;
    }
  }
  return this;
};


a.clean()
发布评论

评论列表(0)

  1. 暂无评论