Как исправить функцию которая возвращает подстроку из переданной строки. (javascript)

Есть функция(см. ниже). Как пример, если вызвать console.log (substr('abba', 2, 3)); выдает - baundefined. В чем причина, помогите разобраться.

Функция принимает на вход три параметра:

  • Строка.
  • Начальный индекс. Значение по умолчанию: 0.
  • Длина подстроки. Значение по умолчанию: длина всей строки.
const substr = (str, index = 0, strL) => {
  let result = '';
  if (strL > str.length) {
    strL = str.length;
  };
  if (strL < 0) {
    strL = 1;
  };
  if (index < 0) {
    index = 0;
  };
  if (index > strL) {
    return '';
  };
  for(let i = index; i < index+strL; i++){
    result += str[i];
  };
  return result;
  };
substr('abba', 0, 1);    // => a
substr('abba', 1, 2);    // => bb
substr('abba', -10, 2);  // => ab
substr('abba', -1, 100); // => abba
substr('abba', -1, -1);  // => a
substr('abba', 1, -10);  // => b
substr('abba', 1, 10);   // => bba
substr('abba', 1, 0);    // => ''
substr('abba', 100, 3);  // => ''

Ответы (3 шт):

Автор решения: DraKoan

Проблема здесь:

result += str[i];

Сложение result += str[i]; воспринимается JS как конкатенация строк. Символ номер которого больше чем str.length возвращает undefined. JS пытается сложить строчку и тип Undefined, приводит undefined к строчке 'undefined' и записывает его в конец строки result.

Вариантов исправления 2.

  1. Ввести переменную max = index+strL и заранее не дать ей превзойти str.length
  const max = index + strL
  if( max > str.length ) max = str.length;

  for( let i = index; i < max; i++ ) {
    result += str[i];
  }
  1. Проверять в цикле и делать break, если сумма превысила. Первый вариант лучше, проверок меньше.
→ Ссылка
Автор решения: Pavel Grishaev

Как @vsemozhebuty писал в коментах, у вас неверные предположения в коде. Вот что-то более-менее похожее на рабочий код, с сохранением вашего подхода:

const substr = ( str, index = 0, strL )=>{

  if( index < 0 || index > str.length - 1 ) throw Error('неверный индекс');
  if( strL < 0 ) throw Error('неверная длина');
  
  if( index + strL > str.length ){
    strL = str.length - index;
  }
  
  let result = '';
  
  for( let i = index; i < index + strL; i++ ){
    result += str[i];
  }
  
  return result;
};

console.log( substr('abba',2,3) );

console.log( substr('abba',3,500) );

/* Проверки с ожидаемыми ошибками:

console.log( substr('abba',-1,500) );

console.log( substr('abba',500,3) );

console.log( substr('abba',2,0) );
*/

→ Ссылка
Автор решения: MoloF

Чем вам не угодила стандартная функция substr встроенная в js?

const substr = ( str, index = 0, strL )=>{

  if( index < 0 || index > str.length - 1 ) throw Error('неверный индекс');
  if( strL < 0 ) throw Error('неверная длина');
  
  if( index + strL > str.length ){
    strL = str.length - index;
  }
  
  let result = '';
  
  for( let i = index; i < index + strL; i++ ){
    result += str[i];
  }
  
  return result;
};

console.log( substr('abba',2,3) );
console.log( substr('abba',3,500) );

console.log('abba'.substr(2, 3));
console.log('abba'.substr(3, 500));

→ Ссылка