2010-09-05 25 views
7

Potrzebuję funkcji JavaScript, aby powiedzieć, czy obiekt typu string jest pusty. Mówiąc "puste", mam na myśli to, że nie wszystkie są tylko białymi znakami. Napisałem ten prototyp:Ustal, czy ciąg znaków jest "pusty".

String.prototype.isEmpty = function() { 
    return this.length === 0 || this === " " || this.test(/^\s*$/); 
} 

Czy wszystko w porządku?

Czy istnieje bardziej wydajna wersja tego?

+5

Twój === 'to "" 'test zawsze będzie fałszywy, ponieważ' this' jest obiektem 'String', a nie natywnym łańcuchem i dlatego nigdy nie będzie" ściśle równy "do' "". –

+0

Jak sądzisz ciąg '' \ 0 "'? – kiamlaluno

+0

@Matthew: Czy wszystkie natywne ciągi zasadniczo nie są obiektami typu String? W każdym razie przetestowałem to w firefox: 'String.prototype.foo = function() {return (this ==" ")};" ".foo()' <- działa (przynajmniej w firefox)! – slebetman

Odpowiedz

4

Wygląda na to, że musisz użyć /^\s*$/.test(this) zamiast this.test(/^\s*$/). Nie ma metody test() dla strings, chyba że używasz biblioteki JavaScript, która implementuje tę metodę.

Byłoby wystarczające, ale pierwsze dwa wyrażenia spowodowałyby zwarcie, gdyby którykolwiek z nich był prawdziwy, bez konieczności sprawdzania wyrażenia regularnego. To powinno być całkiem wydajne.

Jako komentarz zaznaczony w powyższym komentarzu, twoje wyrażenie this === " " zawsze będzie oceniać jako fałszywe. Można usunąć ten wyraz lub użyj == jeśli byś będą oczekiwać dużo strun z tylko jednym znakiem spacji:

String.prototype.isEmpty = function() { 
    return this.length === 0 || this == " " || /^\s*$/.test(this); 
} 
+0

Nie ma sensu sprawdzać, czy 'ta.length' jest ściśle równa 0. Czy istnieje jakaś poprawna wartość' tej.wielkości', która może być równa 0, bez być 0? – kiamlaluno

+0

@kiamlaluno: Masz rację. Ale generalnie używanie ścisłych równań ==== w miarę możliwości jest uważane za najlepszą praktykę wśród wielu programistów JavaScript. I myślę, że nie ma w tym żadnej szkody. –

+0

Ogólnie rzecz biorąc może zaistnieć szkodliwość w korzystaniu z operatora '===' w przynajmniej jednym przypadku. – kiamlaluno

1
String.prototype.isEmpty = function() { 
    return this.length == 0 || /^\s*$/.test(this); 
} 

Jest tylko możliwość z 255 (bez uwzględnienia znaków Unicode kod większy niż 255), że ciąg o długości 1 zawiera znak spacji. Biorąc pod uwagę łańcuchy o długości większej niż 1, możliwość staje się jeszcze niższa.

+0

Chciałbym zakwestionować to prawdopodobieństwo. Dlaczego 1/255? Po pierwsze, zakładasz 255 znaków, podczas gdy w rzeczywistości jest ich trochę więcej. Następnie zakładasz to samo prawdopodobieństwo dla każdej postaci, tak jakby wybierzesz losowo. Przestrzeń jest * prawdopodobnie * najczęstszą postacią w bloku tekstu i może być bardzo powszechna jako pojedyncza litera w scenariuszu OP. – Kobi

+0

@Kobi: Nie mówiłem o prawdopodobieństwie. Nie jestem wtedy pewien, czy łańcuch złożony z samej spacji jest najbardziej prawdopodobnym łańcuchem przekazanym do funkcji JavaScript; jeśli kod JavaScript obsługuje nazwę użytkownika wstawioną od użytkownika w formularzu, łańcuch złożony z pojedynczej spacji jest prawdopodobnie tym mniej prawdopodobnym sygnałem wejściowym. – kiamlaluno

+0

O czym mówi kiamlaluno, jest pominięcie jawnego testu oryginalnego plakatu dla ciągu zawierającego pojedynczą spację. Zgadzam się, że nie jest to konieczne. –

12

Zastosowanie

String.prototype.isEmpty = function() { 
    if (!this.match(/\S/)) { 
    return ('enter some valid input.Empty space is not allowed'); 
    } else { 
    return "correct input"; 
    } 
} 


alert("test 1:"+(" ".isEmpty())); 
alert("test 2:"+(" \t ".isEmpty())); 
alert("test 3:"+(" \n ".isEmpty())); 
alert("test 4:"+("hi".isEmpty())); 

Uwaga:

\ s pasuje spacją: przestrzeń, kartę lub nowego wiersza.

\ S dopasuje znak bez białych znaków: wszystko oprócz spacji, tabulatora lub nowej linii. Jeśli twój ciąg ma pojedynczy znak, który nie jest spacją, tabulatorem lub nową linią, to nie jest pusty. Dlatego wystarczy wyszukać jeden znak: \ S

+0

+1 dla prostoty i obsługi nowych linii i zakładek .. –

+0

To nie jest dobra odpowiedź. W ogóle nie odnosiłeś się do wydajności. Zasadniczo wymyśliłeś gorszą wersję mojej implementacji (jeśli została poprawiona przy pomocy opinii Mathew Crumley'a). Na przykład, czy użycie wyrażeń regularnych przez sprawdzenie długości właściwości obiektu powoduje obniżenie wydajności? – CantSleepAgain

0

I bawił się niektóre rzeczy:

  • Wracam odwrotność this.length, 0, który jest true, za wszystko inny numer, który jest false.
  • Usunąłem czek na " ". W rzeczywistości nie widziałem zbyt wiele, jeśli w jakimkolwiek przypadku, gdy wprowadzono pojedynczą spację, usunięcie czeku jest średnio IMO szybsze.
  • I odwrócone wyrażenie < -> ciąg jak inni.

String.prototype.isEmpty = function() {
return !this.length || /^\s*$/.test(this);
}

1

Generalnie, używając RegExp.prototype.test do sprawdzania dopasowania wzorca bez zestawiania tablicy zwracanej meczów (String.prototype.match) prawdopodobnie ma lepszą wydajność.Chciałbym spróbować - ale nie zostały jeszcze przetestowane - coś takiego:

function isEmpty() { 

    var string = arguments[0] ; 
    var EMPTY_STRING_PATTERN = /^\s*$/ , empty = false ; 

    if(EMPTY_STRING_PATTERN.exec(string) === true) empty = true ; 

    return empty ; 

} 

Na marginesie, to jest uważany za złą praktyką skrzypce z obiektu prototypu rdzenia javascript obiekty.

Powiązane problemy