Подтвердить что ты не робот

Длина массива различается в Internet Explorer с трейлинг-запятой

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

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

код:

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

EDIT:

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

4b9b3361

Ответ 1

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

Это также относится к ARRAY

Quirks Javascript Browser - массив .Length

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

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

Для более безопасного теста, пожалуйста, посмотрите на другое предложение на этой странице: Длина массива в Internet Explorer с трейлинг-запятой - ДЕМО ЗДЕСЬ

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

Ответ 2

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

Изменить

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

var a = [0,1,];

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

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

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

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

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

Ответ 3

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

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()