Сообщение от melky
|
length - длину значений - см. массив.
|
Сообщение от melky
|
было бы неплохо не учитывать унаследованные свойства и проверять ключ на принадлежность к числу.
|
Короче говоря, я тщательно исследовал Ваш код (пример) и пришел к выводу, что со свойством length надо быть осторожным.
Не знаю, что Вы подразумевали под "длиной значений", но для нормальной работы Вашего алгоритма в length должно быть не количество элементов (свойств объекта), а максимальный индекс свойства (это максимальное значение ключа), увеличенный на 1. Причем IE как всегда выпендрился: ему не надо к length прибавлять 1, иначе в объекте остается одно лишнее свойство (последнее). Код получился такой:
var myObj = {};
myObj.length = 0; // это не количество элементов, а максимальный индекс + 1
myObj[1]= "1";
myObj[3]= "3";
myObj[2]= "2";
myObj[0]= "0";
myObj[100]= "100";
myObj[99]= "99";
var length = 0;
// подсчет length как количества свойств
///for (i in myObj) length++;
// подсчет length как максимального индекса
for (i in myObj)
{
if (i > length) length = Number(i);
};
if (window.IE)
myObj.length = length;
else myObj.length = length + 1;
var s = '';
for (var key in myObj) s = s + ' ' + key + '=' + myObj[key];
alert('1). ' + s);
// 1). 0=0 1=1 2=2 3=3 99=99 100=100 length=101
Array.prototype.splice.call(myObj, 2, 1); // удаляем один элемент
var s = '';
for (var key in myObj) s = s + ' ' + key + '=' + myObj[key];
alert('2). ' + s);
// 2). 0=0 1=1 2=3 98=99 99=100 length=100