Возвращаемое значение из .reduce()
обратного вызова значения, передаваемые последовательно для каждого вызова функции обратного вызова. Если первая итерация обратного вызова возвращает только значение .length
, то номер будет передан на вторую итерацию. Когда это произойдет, ваш код попытается найти свойство .length
на номере, которого не будет, и вы в конечном итоге жонглируете значением undefined
.
Итак, в первой (рабочей) версии кода обратный вызов сначала вызывается с a
, являющимся первым словом разделенной строки, а b
- вторым. Он возвращает либо a
, либо b
. Затем обратный вызов снова вызывается с результатом этого первого вызова как a
, а третье слово - b
. Процесс повторяется до тех пор, пока последнее слово не будет передано как b
, и окончательная строка будет возвращена. Затем, после завершения .reduce()
, код захватывает .length
этой кратчайшей строки.
Во второй (нерабочей) версии первый вызов такой же, как в рабочей версии, с первым словом a
, а второй - b
. Обратный вызов возвращает длину более короткого слова. Таким образом, при втором вызове обратного вызова a
представляет собой число (ранее возвращенную более короткую длину) и b
является третьим словом. Доступ к a.length
будет undefined
, поэтому сравнение будет false
, и функция вернет a.length
, что составляет undefined
. При третьем вызове обратного вызова a
будет поэтому undefined
, и попытка получить доступ к a.length
вызовет исключение.
Вам не нужно писать свою собственную логику, чтобы найти минимальный список - 'Math.min' уже делает это. Попробуйте 'Math.min (... s.split ('') .map (({length}) => length)'. –