Здравствуйте. Подскажите, пожалуйста, почему такой код выдает ошибку:
Uncaught TypeError: Cannot read property 'indexOf' of undefined at script.js:21
var input = 'javascript is awesome';
var output = input.split('');
for(var i = 0; i <= output.length; i++) {
if(output[i].indexOf('a') != -1) {
output[i] = '4';
} else if (output[i].indexOf('e') != -1) {
output[i] = '3';
} else if (output[i].indexOf('o') != -1) {
output[i] = '0';
}
}
output.join('');
alert(output);
Нужно не так:
i <= output.length;
а так:
i < output.length;
Потому что отсчет ведется с нуля и в итоге получается вы выходите за границы массива на 1 символ.
(var i = 0; i <= output.length; i++) - тут проблема, а именно в <=. Вы от первого элемента 0, до элемента output.length. Так как отсчет начинатся с 0, то элемента с индексом output.length не существует. Используйте <
var input = 'javascript is awesome';
var output = input.split('');
for(var i = 0; i < output.length; i++) {
if(output[i].indexOf('a') != -1) {
output[i] = '4';
} else if (output[i].indexOf('e') != -1) {
output[i] = '3';
} else if (output[i].indexOf('o') != -1) {
output[i] = '0';
}
}
output.join('');
alert(output);
Кроме неверного условия цикла(что уже было указано в соседних ответах), в вашем коде есть еще, как минимум одна проблема:
output.join('');
не меняет значение переменной output (как вам почему то кажется), а возвращает новое значение-строку.
По-хорошему, вместо вашего "страшненького" цикла, можно использовать одну единственную функцию Array.prototype.map:
var input = 'javascript is awesome';
var output = input.split('').map(function (char) {
switch (char) {
case 'a':
return 4;
case 'e':
return 3;
case 'o':
return 0;
default:
return char;
}
}).join('');
alert(output);
А вот и рабочий пример на JSFiddle.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости