Длина массива различается в Internet Explorer с трейлинг-запятой
В настоящее время я работаю с некоторыми данными, используя Javascript, который находится в форме массива. Массив может содержать пустую запись в конце, например [1,2,]
. В Google Chrome и Firefox длина этого примера будет равна 2; однако в IE длина равна 3.
Короче: Internet Explorer предоставляет различную длину для массива в Javascript, чем Google Chrome и Firefox. Есть ли способ стандартизировать это поведение во всех браузерах?
код:
var a = [1,];
alert(a.length);
EDIT:
Многие ответы говорят о том, что у них нет конечной запятой, однако данные мне даны таким образом.
Ответы
Ответ 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()