2009-09-13 15 views
143

Co to jest czysta i wydajna implementacja JavaScriptu, aby usunąć spacje z początkowych i końcowych spacji?Pasek napisów() dla JavaScript?

Na przykład:

" dog"

"dog "

" dog "

" dog "

wszystko się zamienił

"dog"

+22

Ta funkcja jest określana jako "przycinanie". Zobacz https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Objects/String/Trim – Gumbo

+1

@Gumbo: przycinanie jest nieco nowsze i może nie być obsługiwane w różnych przeglądarkach. Nie wiem, ale nigdy nie możesz powiedzieć, korzystając z obsługi wielu przeglądarek. –

Odpowiedz

168

Użyj tego:

if(typeof(String.prototype.trim) === "undefined") 
{ 
    String.prototype.trim = function() 
    { 
     return String(this).replace(/^\s+|\s+$/g, ''); 
    }; 
} 

funkcji przycinania będzie teraz dostępny jako funkcja pierwszej klasy na swoich strun. Np

" dog".trim() === "dog" //true 

EDIT: zrobić sugestię J-P, w celu połączenia się w jedną wyrażeń regularnych wzorów. Dodano również modyfikator globalny na sugestię Christopha.

Wyobraź sobie, że Matthew Crumley powąchał funkcję przycinania przed odtworzeniem jej. Odbywa się to w przypadku, gdy wersja JavaScript używana na kliencie jest nowsza i dlatego ma własną, natywną funkcję przycinania.

+3

http://blog.stevenlevithan.com/archives/faster-trim-javascript dla niektórych danych wydajnościowych – Christoph

+2

, aby były zgodne ze specyfikacją ECMA, 'trim()' musi rzutować 'this' na ciąg znaków, np. Muszę zmienić 'this.replace (...)' na 'String (this) .replace (...)' lub '('' + this) .replace (...)'; to pozwala 'call()' lub 'apply()' funkcję na wartości inne niż ciąg znaków – Christoph

+0

@Christoph: czy chcesz powiedzieć w definicji funkcji String.prototype.trim() = ...? Spodziewałbym się, że "to" odnosi się już do ciągu znaków, ponieważ jest to prototypowa funkcja rozszerzająca typ String. –

10

Oto funkcja, której używam.

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

Jeśli zamiast pisać nowy kod do przycinania napisu, patrzysz na istniejący kod, który wywołuje "strip()" i zastanawiasz się, dlaczego to nie działa, możesz chcieć sprawdzić, czy próbuje on dołączyć coś podobnie jak framework prototypejs i upewnij się, że faktycznie się ładuje.
Ta struktura dodaje funkcję strip do wszystkich obiektów String, ale jeśli np. uaktualniłeś go, a twoje strony wciąż odwołują się do starego pliku .js, ale oczywiście nie zadziała.

+3

właśnie dlatego przyjechałem tutaj! – momeara

64

Gumbo już zauważyć to w komentarzu, ale to ponosi powtarzając jako odpowiedź: Metoda trim() dodano w JavaScript 1.8.1 i jest obsługiwany przez wszystkie nowoczesne przeglądarki (Firefox 3.5+, IE 9, Chrome 10, Safari 5.x), chociaż IE 8 i starsze nie obsługują tego.Sposób użycia jest prosty:

" foo\n\t ".trim() => "foo" 

Patrz także:

7

Jeśli już przy użyciu jQuery, to może warto przyjrzeć się jQuery.trim() który jest już dostarczony z jQuery.

11

Lepszym polyfill z MDN który obsługuje usuwanie BOM i NBSP:

if (!String.prototype.trim) { 
    String.prototype.trim = function() { 
    return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); 
    }; 
} 

Należy pamiętać, że modyfikacja wbudowanych prototypów pochodzi z przeboju wydajności (ze względu na ratowanie silnika JS na liczby optymalizacje środowiska wykonawczego), aw sytuacjach krytycznych z punktu widzenia wydajności może zaistnieć potrzeba rozważenia alternatywy dla definiowania myTrimFunction(string). Mimo to, jeśli kierujesz reklamy na starsze środowisko bez pomocy natywnej .trim(), prawdopodobnie masz do czynienia z ważniejszymi problemami z wydajnością.

Powiązane problemy