2016-02-18 2 views
5

Я пытаюсь создать массив для целей листинга в Ionic Framework и проверить все символы первого имени callcenter, чтобы добавить их в алфавитном массиве.Перемещение списков приводит к бесконечному циклу

for (var i = 0; i < callcenterList.length; i++) { 
    var value = callcenterList[i]._owner && callcenterList[i]._owner.company.name[0]; 

    if ((alphabet.indexOf(value) == -1 && isNaN(parseInt(value))) || 
     (isNaN(alphabet[0]) && !isNaN(value))) { 
     if(!isNaN(value)) 
     value = 123; 

     alphabet.push(value); 

     callcenterList.splice(i, 0, { 
     divider: { 
      alphabet: value 
     } 
     }); 
    } 
    }; 

Замена value = 123 с value = '#' вызывает Google Chrome и Google Chrome Canary сбои в работе и сразу же использовать до 100% оперативной памяти в Mac.

Является ли это ошибкой Javascript или это связано с самим Google Chrome?

+0

Никогда не слышал об этом раньше ... – durbnpoisn

+0

Неважно, если вы используете двойные кавычки, а не одиночные? –

+1

Ну, если это #, то это не часть алфавита, и это не число, и поскольку вы ограничиваете свой цикл на основе callcenterList.length (и нажимаете внутри цикла), я не думаю, что он должен делать либо с # и ни с хромом? :) – Icepickle

ответ

6

Это не ошибка в вашем браузере или что-то еще: вы просто создаете условие, в котором ваш код переходит в бесконечный цикл, который всегда имеет тенденцию заставлять браузер захватывать. Вы можете сделать то же самое с простым циклом while (true) {}.

В частности, вы выполняете итерацию по callcenterList, и в любое время isNaN(alphabet[0]) вы соединяете новый элемент в callcenterList. alphabet[0] будет иметь первое значение, которое вы нажимаете там, которое в условном выражении вы собираетесь установить на '#'.

Таким образом, isNaN(alphabet[0]) всегда будет правдой.

Следовательно, вы будете продолжать добавлять значения в callcenterList.

Поэтому i < callcenterList.length всегда будет правдой.

+0

Это простой цикл. И нет никакого условия, которое могло бы создать бесконечный цикл. Даже если условие «if» кажется неправильным, цикл for должен продолжать итерацию. Что я делаю неправильно в этой ситуации? – Yagiz

+1

@Yagiz Вы добавляете элемент в итерирующий массив внутри цикла с помощью 'splice'. Поскольку это делается каждый раз, 'i' никогда не достигнет длины массива. –

+0

@Yagiz: Я добавил более подробное объяснение в свой ответ. В основном, что сказал E_net4: вы увеличиваете длину своего массива с каждой итерацией, так что вы никогда не достигнете конца. – StriplingWarrior

1

Поскольку трудно поверить, что длина быть переоценены, вот простой пример того, что проблемы, которые вы могли бы получить

Без заявления перерыва, код будет работать в бесконечном цикле. (Проверьте журнал консоли, как долго этот список может быть)

var list = [0,1,2,3]; 
 

 
for (var i = 0; i < list.length; i++) { 
 
    list.push(i); 
 
    if (i > 1000) { 
 
    break; 
 
    } 
 
} 
 

 
console.log(list.length);

Ваш код делает то же самое, за исключением того, что функция сращивания будет добавить новый элемент в определенном положении в списке (nl, ваш индекс). В конце концов, он все равно увеличит длину, и ваш список будет длиннее.

Смежные вопросы