JavaScript: Не получается добавить в массив отдельные слова из строки

Всем привет! Недавно начал изучать javascript, до этого немного баловался java, возможно, поэтому и возникла проблема ниже. Нужно с помощью цикла из строки взять отдельные слова и их вставить в пустой массив, не используя метод split(). Пробовал код ниже, но выдает пустой массив. Подскажите. в чем проблема.

let sentence = 'Всем большой привет';
let list = [];
let word;
let start = 0;
for (var i = 0; i < sentence.length; i++) {
    if (sentence.charAt(i) == " ") {
        word = sentence.substring(start, i);
        list.push(word);
        start = i;
    }
}
console.log(list);

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

Автор решения: novvember
  1. У вас лишняя ; внутри цикла for между условием и телом цикла. Поэтому все в принципе ломается, цикл не выполняется, а результат — пустой массив.
  2. start — это позиция пробела. С текущим кодом пробел войдет в следующее слово. поэтому лучше сдвинуться на 1 позицию дальше
  3. Вы слова ищите от прошлого места до пробела. Так последнее слово вы не найдете (после него же нет пробела). Как минимум просто прибавьте к строке пробел.

let sentence = 'Всем большой привет';
sentence += ' ';
let list = [];
let word;
let start = 0;
for (var i = 0; i < sentence.length; i++) {
  if (sentence.charAt(i) == " ") {
    word = sentence.substring(start, i);
    list.push(word);
    start = i + 1;
  }
}
console.log(list);

→ Ссылка
Автор решения: Евгений Колмак

const string = 'Всем большой привет';

const splitString = text => {
  const str = text + ' ';
  const result = [];
  let word = '';
  for (const symbol of str) {
    if (symbol !== ' ') {
      word += symbol
    } else {
      result.push(word);
      word = '';
    }
  }
  return result;
}

console.log(splitString(string));

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

Если вдруг нужен вариант с игнорированием любых пробелов, то вот он:

const sentence = '         Всем          большой             привет          ';
const words = [];
let word = -1;
let startNewWord = true;

for (const symbol of sentence) {

    if (symbol === ' ') {
      if (startNewWord === false) startNewWord = true;
      continue;
    }
    
    if (startNewWord) {
      words[++word] = '';
      startNewWord = false;
    }
    
    words[word] += symbol;
}

console.log(words);

  • Строки в JS прекрасно позволяют брать нужный символ как из массива с помощью string[i], потому не вижу нужды в данном месте использовать метод charAt(i)
  • Сравнения лучше делать с ===, а не ==
  • Если у вас в коде есть if без else, то не стоит пихать весь код в if, лучше вытащить всё из if, а в if написать обратное условие. Так код будет намного легче читать и понимать. Я понимаю что это не всегда возможно и нужно (например если всего 1 команда в if), но поверьте моему опыту в очень многих случаях это возможно
  • Избегайте операций со строками как можно больше. В данном случае вам просто надо один раз пройтись по всем символам, а если каждый раз брать подстроку, то это скажется на скорости работы в больших строках
→ Ссылка