Неправильная длина Javascript в IE - PullRequest
5 голосов
/ 28 марта 2012

У меня есть объект следующим образом:

    var dataSources = [
        {
            Stage:  [2, 3, 4],
            Name:   "GetAustralianStateList"
        },
        {
            Stage: [2, 3, 4],
            Name: "GetGenderList"
        },
        {
            Stage: [2, 3, 4],
            Name: "GetTitleList"
        },
        {
            Stage: [2, 3, 4],
            Name: "GetCountryList"
        },
        {
            Stage: [2, 3, 4],
            Name: "GetRegionList"
        },
        {
            Stage: [2, 3, 4],
            Name: "GetNonEnglishLanguageList"
        },
        {
            Stage: [2, 3, 4],
            Name: "GetContactRelationshipList"
        },
        {
            Stage: [3, 4],
            Name: "GetCompanyCodeList"
        },
        {
            Stage: [3, 4],
            Name: "GetBusinessContractList"
        },
        {
            Stage: [3, 4],
            Name: "GetPayrollAreaList"
        },
        {
            Stage: [3, 4],
            Name: "GetAdministrationAreaList"
        },
        {
            Stage: [3, 4],
            Name: "GetWorkContractList"
        },
        {
            Stage: [2, 3, 4],
            Name: "GetFirstLanguageList"
        },
    ];

Когда я вызываю dataSources.length в Chrome, он возвращает правильное количество элементов в объекте.Однако Internet Explorer возвращает длину на 14 - 1 больше, чем на самом деле в объекте.

Есть идеи?

Ответы [ 4 ]

8 голосов
/ 28 марта 2012

См. , после последнего объекта?

IE видит исключенный элемент из-за него.

6 голосов
/ 28 марта 2012

К сожалению, вы обнаружили одну из очень немногих ошибок в реализациях ECMAScript: IE обрабатывает одну конечную запятую в литерале массива как исключение, поэтому он увеличивает длину на единицу:

var a = [0,1,];

alert(a.length);  // 3 in IE
                  // 2 in other browsers

a.hasOwnProperty('2'); // false in all browsers

Выше показано, что IE рассматривает запятую как исключение: длина была увеличена на единицу, но в индексе нет элемента массива 2.

1 голос
/ 23 марта 2013

Это также может произойти при построении массивов с помощью «push». Я ударил его с помощью кода, подобного этому:

var Entries = new Array;
...some loop that adds entries...
Entries.push( createEntry( values ) );

Функция createEntry выполнит некоторую проверку массива 'values', а если эта проверка не удастся, просто не вернет значение. Затем неопределенное значение будет помещено в массив Entries. Если бы эта неопределенная запись была 'последним' значением, она бы потерпела неудачу в I.E. браузеры. Чтобы исправить это, я использовал:

var Entries = new Array;
...loop to add entries...
var Entry = createEntry( values );
if( Entry ) Entries.push( Entry );

По сути, не помещайте материал в массив, если он не определен.

1 голос
/ 28 марта 2012

Вы должны удалить последний ",", например:

    {
        Stage: [2, 3, 4],
        Name: "GetFirstLanguageList"
    }
];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...