Не може да се прочете свойството „разделяне“ на недефинирано

Ако някога сте се използва JavaScript е splitметод, има добър шанс, че сте имали следната грешка: TypeError: Cannot read property 'split' of undefined.

Има няколко причини, поради които бихте получили тази грешка. Най-вероятно това е просто основно неразбиране на това как splitработи и как да се итерира през масиви.

Например, ако се опитате да изпратите следния код за предизвикателство „Намиране на най-дългата дума в низ“:

function findLongestWord(str) { for(let i = 0; i < str.length; i++) { const array = str.split(" "); array[i].split(""); } } findLongestWord("The quick brown fox jumped over the lazy dog");

ще хвърли TypeError: Cannot read property 'split' of undefinedгрешката.

В splitметода

Когато splitсе извика на низ, той разделя низа на поднизове въз основа на разделителя, предаден като аргумент. Ако празен низ е предаден като аргумент, splitтретира всеки знак като подниз. След това връща масив, съдържащ поднизовете:

const testStr1 = "Test test 1 2"; const testStr2 = "cupcake pancake"; const testStr3 = "First,Second,Third"; testStr1.split(" "); // [ 'Test', 'test', '1', '2' ] testStr2.split(""); // [ 'c', 'u', 'p', 'c', 'a', 'k', 'e', ' ', 'p', 'a', 'n', 'c', 'a', 'k', 'e' ] testStr3.split(","); // [ 'First', 'Second', 'Third' ] 

Вижте MDN за повече подробности относно split.

Проблемът е обяснен с примери

Знанието какво splitвръща методът и колко подниза можете да очаквате е ключът към решаването на това предизвикателство.

Нека да разгледаме още веднъж кода по-горе и да видим защо той не работи както се очаква:

function findLongestWord(str) { for(let i = 0; i < str.length; i++) { const array = str.split(" "); array[i].split(""); } } findLongestWord("The quick brown fox jumped over the lazy dog"); 

Разделянето strв масив като този ( const array = str.split(" ");) работи както се очаква и се връща [ 'The',   'quick',   'brown',   'fox',   'jumped',   'over',   'the',   'lazy',   'dog' ].

Но погледнете по-отблизо forцикъла. Вместо да използва дължината на arrayкато условие за итерация i, str.lengthвместо това се използва.

strе „Бързата кафява лисица прескочи мързеливото куче“ и ако влезете str.lengthв конзолата, ще получите 44.

Последното твърдение в тялото на forцикъла е това, което е причината за грешката: array[i].split("");. Дължината на arrayе 9, така iче бързо ще премине през максималната дължина на array:

function findLongestWord(str) { for(let i = 0; i < str.length; i++) { const array = str.split(" "); console.log(array[i]); // array[0]: "The" // array[1]: "quick" // array[2]: "brown" // ... // array[9]: "dog" // array[10]: undefined // array[11]: undefined } } findLongestWord("The quick brown fox jumped over the lazy dog"); 

Извикването array[i].split("");за разделяне на всеки низ на поднизове от символи е валиден подход, но ще изхвърли, TypeError: Cannot read property 'split' of undefinedкогато бъде предаден undefined.

Как да се реши Намерете най-дългата дума в низ с split

Нека бързо да прегледаме някакъв псевдо код за това как да решим този проблем:

  1. Разделете strв масив от отделни думи
  2. Създайте променлива, за да проследите най-голямата дължина на думата
  3. Прегледайте масива от думи и сравнете дължината на всяка дума с променливата, спомената по-горе
  4. Ако дължината на текущата дума е по-голяма от съхранената в променливата, заменете тази стойност с текущата дължина на думата
  5. След като дължината на всяка дума бъде сравнена с променливата за максимална дължина на думата, върнете това число от функцията

Първо, разделете strсе на масив от отделни думи:

function findLongestWordLength(str) { const array = str.split(" "); }

Създайте променлива, за да следите най-дългата дължина на думата и я задайте на нула:

function findLongestWordLength(str) { const array = str.split(" "); let maxWordLength = 0; }

Сега, когато стойността на arrayе ['The', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog'], можете да използвате array.lengthвъв вашия forцикъл:

function findLongestWordLength(str) { const array = str.split(" "); let maxWordLength = 0; for (let i = 0; i < array.length; i++) { } }

Прегледайте масива от думи и проверете дължината на всяка дума. Не забравяйте, че низовете също имат lengthметод, който можете да извикате, за да получите лесно дължината на низ:

function findLongestWordLength(str) { const array = str.split(" "); let maxLength = 0; for (let i = 0; i < array.length; i++) { array[i].length; } }

Използвайте ifоператорска проверка дали дължината на текущата дума ( array[i].length) е по-голяма от maxLength. Ако е така, заменете стойността на maxLengthс array[i].length:

function findLongestWordLength(str) { const array = str.split(" "); let maxLength = 0; for (let i = 0; i  maxLength) { maxLength = array[i].length; } } }

И накрая, върнете се maxLengthв края на функцията, след forцикъла:

function findLongestWordLength(str) { const array = str.split(" "); let maxLength = 0; for (let i = 0; i  maxLength) { maxLength = array[i].length; } } return maxLength; }