Длина массива отличается в Internet Explorer с запятой - PullRequest
15 голосов
/ 01 июля 2011

В настоящее время я работаю с некоторыми данными, используя Javascript в форме массива.Массив может содержать пустую запись в конце, например [1,2,].В Google Chrome и Firefox длина этого примера будет равна 2;однако в IE длина равна 3.

Короче говоря: Internet Explorer предоставляет другую длину для массива в Javascript, нежели Google Chrome и Firefox.Есть ли способ стандартизировать это поведение во всех браузерах?

Код:

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

РЕДАКТИРОВАТЬ:

Многие ответы говорят, что запятую не следуетоднако данные передаются мне таким образом.

Ответы [ 3 ]

18 голосов
/ 01 июля 2011

НИКОГДА не иметь запятых в IE.Период.

Это относится и к массивам

Причуды браузера Javascript - массив. Длина

Для обработки вашихотредактируйте эту работу (проверено в IE8):

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

Для более безопасного теста, пожалуйста, посмотрите на другое предложение на этой странице: Длина массива отличается в Internet ExplorerС запятой - DEMO HERE

Кстати, никогда раньше не слышал слов elision или elided - узнайте что-то новое здеськаждый день

9 голосов
/ 01 июля 2011

Нет. IE неправильно интерпретирует одиночную запятую как запятую и добавляет ее к длине, когда это не нужно (ECMA-262 раздел 11.1.4).

Редактировать

Чтобы устранить эту путаницу, IE обрабатывает одну конечную запятую в литерале массива (неправильно) как исключение, что означает, что он увеличивает свойство длины массива , но не создает свойство . Другими словами, дано:

var a = [0,1,];

В IE a.length равен 3, но свойства a [2] нет. Поэтому, если подходящим решением является удаление только исключенных членов из конца массива (что, вероятно, является лучшим решением, если они представляют собой проблему), тогда:

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

удалит только исключенных членов из конца массива (то есть свойств, которые не существуют), не удалит их в другом месте и не будет тратить время на итерации по всему массиву ( что может привести к добавлению избранных участников как неопределенных). Чтобы добавить в Array.prototype:

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

Обратите внимание, что именно так Array.prorotype.filter работает, он не выполняет итерацию по проверяемым элементам (он использует тест hasOwnProperty и удаляет все разрешенные члены как часть фильтрации массив).

4 голосов
/ 01 июля 2011

Попробуйте удалить пустые элементы:

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

Тогда это должно работать одинаково в IE и других браузерах.

Обновление : если версия JS нижечем 1.6, попробуйте это:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...