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ść.


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.


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;

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 ()”


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.


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,'');
}

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

5

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

var stringValue = str.toString();
return stringValue.replace(/^\s+|\s+$/g,'');

3

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


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. :)


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 ().

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.