Почему Array.length не работает со строкой ключа

Я читал и делал некоторое тестирование и нашел что команда. "Длина" Массива () JavaScript не работает, когда ключи массива являются строкой. Я нашел, что для выполнения этой команды я использую целые ключи.

Однако интересно, может ли какой-либо из Вас сказать мне почему это правило? Ограничение языка или спецификация логики? Или, моя ошибка...?

Спасибо

Obs.: Ключ к моему массиву является строкой (название компонента), но значения и массив объектов.

Declarating:

objElementos = new Array();

Объект:

objElemento = function(Id){
this.Id        = $('#' + Id).attr('id');
this.Name      = $('#' + Id).attr('name');
this.CssLeft   = $('#' + Id).css('left');
this.CssBottom = $('#' + Id).css('bottom');
this.Parent    = $('#' + Id).parent().get(0);
this.Childs    = new Array();

this.addChild = function(IdObjChild) {
    try {
        if ($('#' + IdObjChild).attr('id') != '')
            this.Childs[$('#' + IdObjChild).attr('id')] = new objElemento(IdObjChild);
    } catch(err){ $('#divErrors').prepend('<p>' + err + '</p>'); }
}

this.getChildCount = function(){
    try {
        $('#divErrors').prepend('<p>' + this.Childs.length + '</p>');
        return this.Childs.length;
    } catch(err){ $('#divErrors').prepend('<p>' + err + '</p>'); }
}

this.updateCssLeft = function(CssPosition){
    try {
        $('#divErrors').prepend('<p>updateCssLeft:' + this.Id + ' / ' + this.CssLeft + '</p>');

        $('#' + this.Id).css('left',CssPosition);
        this.CssLeft = $('#' + this.Id).css('left');

        $('#divErrors').prepend('<p>updateCssLeft:' + this.Id + ' / ' + this.CssLeft + '</p>');         
    } catch(err){ $('#divErrors').prepend('<p>' + err + '</p>'); }
}

this.updateCssBottom = function(CssPosition){
    try {
        $('#divErrors').prepend('<p>updateCssBottom:' + this.Id + ' / ' + this.CssBottom + '</p>');

        $('#' + this.Id).css('bottom',CssPosition);
        this.CssBottom = $('#' + this.Id).css('bottom');

        $('#divErrors').prepend('<p>updateCssBottom:' + this.Id + ' / ' + this.CssBottom + '</p>');
    } catch(err){ $('#divErrors').prepend('<p>' + err + '</p>'); }
}
  }

Использование:

objElementos['snaptarget'] = new objElemento('snaptarget');
5
задан Paulo Henrique 7 July 2010 в 18:12
поделиться

2 ответа

При использовании строковых "индексаторов" в массиве, вы фактически рассматриваете его как объект, а не массив, и добавляете дополнительные поля к этому объекту. Если вы не используете целочисленные индексы, то нет особого смысла в использовании типа Array, и вместо него имеет смысл использовать тип Object. Вы можете подсчитать поля следующим образом:

var c=0;
for(var fieldName in obj)
{
    c++;
}
6
ответ дан 14 December 2019 в 08:40
поделиться

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

0
ответ дан 14 December 2019 в 08:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: