var.replace nie jest funkcją

141

Używam poniższego kodu, aby spróbować przyciąć ciąg w Javascript, ale otrzymuję błąd wspomniany w tytule:

function trim(str) {
    return str.replace(/^\s+|\s+$/g,'');
}

Edytować:

Naprawiłem problem ... przepraszam, że powinienem był umieścić kod tak, jak go wywoływałem ... zdałem sobie sprawę, że przypadkowo przekazałem obiekt samego pola formularza, a nie jego wartość.

Brett
źródło
23
strprawdopodobnie nie jest ciągiem
Pekka
Na marginesie: brakuje cudzysłowów wokół samego regexciągu, co i tak może nie być dobre.
Grant Thomas
4
@MrDisappointment Javascript zawiera dosłowne wyrażenia regularne - nie muszą to być ciągi znaków
Gareth
1
@ Zamknięcie: Możesz znaleźć (lub chcesz rozpocząć) dyskusję na stronie english.stackexchange.com/search?q=contractions
user113716
17
Użyj str.toString().replace(/^\s+|\s+$/g,'')zamiast tego.
M Rostami

Odpowiedzi:

229

Domyślam się, że kod, który wywołuje twoją trimfunkcję, w rzeczywistości nie przekazuje do niej ciągu.

Aby rozwiązać ten problem, można dokonać strciąg w następujący sposób: str.toString().replace(...)
... jak alper wskazał poniżej.

Zamknięcie Cowboy
źródło
39
str.toString()naprawił mój problem.
Alper
Cóż, str.toString()jest rozwiązaniem tylko wtedy, gdy przekazujesz poprawną wartość, którą można z powodzeniem przekonwertować na ciąg; w moim przypadku w ogóle mijałem coś złego. :)
Brett
Ja też się ten sam błąd, próbowałem toString () ale coraz błąd: nie można odczytać właściwość „toString” jest niezdefiniowana i taka sama dla „zastąpić”
Hitesh Kumar
90

prawdopodobne problemy:

  • zmienna to LICZBA (zamiast łańcucha);
    num=35; num.replace(3,'three'); =====> ERROR
    num=35; num.toString().replace(3,'three'); =====> CORRECT !!!!!!
    num='35'; num.replace(3,'three'); =====> CORRECT !!!!!!
  • zmienna to obiekt (zamiast łańcucha);
  • zmienna nie jest zdefiniowana;
T.Todua
źródło
1
Dzięki Za to napotkałem problem, w którym otrzymywałem ciąg znaków w obiekcie typu. Przekonwertowałem ten obiekt za pomocą toString (). I to działa! Dziękuję Ci!
Vishwajit R. Shinde,
14

Zastąpienie nie zastąpiłoby liczb. Zastępuje tylko struny.

To powinno działać.

function trim(str) {
    return str.toString().replace(/^\s+|\s+$/g,'');
}

Jeśli chcesz tylko przyciąć ciąg. Możesz po prostu użyć „str.trim ()”

Kareem
źródło
6

Nie przekazujesz łańcucha, w przeciwnym razie miałby on replacemetodę. Mam nadzieję, że function trim(str) { return var.replace(blah); }zamiast tego nie pisałeś return str.replace.

meder omuraliev
źródło
6

Prawdopodobnie powinieneś przeprowadzić walidację, zanim faktycznie wykonasz swoją funkcję:

function trim(str) {
    if(typeof str !== 'string') {
        throw new Error('only string parameter supported!');
    }

    return str.replace(/^\s+|\s+$/g,'');
}
gion_13
źródło
5

Czy poprawnie nazwałeś swoją funkcję? To znaczy. czy to, co przekazujesz jako parametr, to naprawdę łańcuch?

W przeciwnym razie nie widzę problemu z Twoim kodem - poniższy przykład działa zgodnie z oczekiwaniami

function trim(str) {
    return str.replace(/^\s+|\s+$/g,'');
}


trim('    hello   ');  // --> 'hello'

Jeśli jednak wywołasz swoje functoin z czymś innym niż ciąg znaków, rzeczywiście otrzymasz powyższy błąd:

trim({});  // --> TypeError: str.replace is not a function
Dave Vogt
źródło
5

W przypadku liczby możesz spróbować przekonwertować na ciąg:

var stringValue = str.toString();
return stringValue.replace(/^\s+|\s+$/g,'');
JC Gras
źródło
3

Powinieneś użyć metody toString () skryptu java do konwersji na łańcuch znaków wcześniej, ponieważ metoda replace jest funkcją napisową.

user6619380
źródło
1

Naprawiłem problem ... przepraszam, że powinienem był umieścić kod tak, jak go wywoływałem ... zdałem sobie sprawę, że przypadkowo przekazałem obiekt samego pola formularza, a nie jego wartość.

Mimo wszystko dziękuję za odpowiedzi. :)

Brett
źródło
1
Możesz edytować pytanie, to lepsze niż udzielanie sobie odpowiedzi. Aha, i kiedy już to zrobisz, wybierz jednego z miłych ludzi i zaakceptuj ich odpowiedź. :-)
Christopher Creutzig
2
@ Christopher: Nie; jeśli sam go rozwiązał, powinien napisać odpowiedź i ją zaakceptować. To tak najlepsza praktyka. Umieszczanie rozwiązań w pytaniach i przyjmowanie arbitralnych odpowiedzi nie jest.
Wyścigi lekkości na orbicie
@Tomalak: Jest tutaj kilka poprawnych odpowiedzi, starszych niż ta. Zgadzam się, że zaakceptowanie własnej odpowiedzi, jeśli jest to pierwsza poprawna, jest dobrą rzeczą ™ iz pewnością nie chcę sugerować umieszczania rozwiązania w pytaniu.
Christopher Creutzig
@Christopher: Zaakceptowaną odpowiedzią powinna być ta, która zawiera rozwiązanie użyte przez OP.
Wyścigi lekkości na orbicie
0

upewnij się, że przekazujesz ciąg do metody „zamień”. Miałem ten sam problem i rozwiązałem go, przekazując ciąg. Możesz również sprawić, że będzie to string za pomocą metody toString ().

ayaz-bin-mukhtar
źródło