Wiem, że są lepsze sposoby sprawdzenia ze mną pustego łańcucha.


To jest nie sprawdzanie na ogół pusty ciąg. Właściwie robię coś takiego:

var s = /*who knows?*/;
switch (s.charAt(0)) {
    // ...
}

I chciałem wiedzieć, czy nie mogę uniknąć konieczności wykonania dodatkowej if (!s).

1
Aaron Yodaiken 23 listopad 2011, 19:25

3 odpowiedzi

Najlepsza odpowiedź

Tak, tak długo, jak wartość jest ważnym ciągiem. Rozdział 15.5.4.4 Spec językowy mówi

  1. pozwala na tointeger (POS).
  2. let rozmiar będzie liczbą znaków w s.
  3. IF Pozycja i LT; 0 lub pozycji ≥ Rozmiar, zwróć pusty ciąg.

Nie został zmieniony od ES3. Tłumacze są całkiem dobre wokół kompatybilności z funkcją łańcucha.

Powiedziałem, że niedawno wdrożyłem optymalizację wizeki dla charAt do Kompilator zamknięcia, ale nie zoptymalizowałem kontroli granicznych, ponieważ kompilator nie optymalizuje to, co są uważane za błędy programatora.

4
Mike Samuel 23 listopad 2011, 15:34

Tak, zawsze będzie powrócić "", jeśli indeks przekroczy długość ciągu.

Zrobione z Dokumentacja MDC funkcji {X0}}:

Znaki w ciągu są indeksowane od lewej do prawej. Indeks pierwszego znaku wynosi 0, a indeks ostatniego znaku w ciąg zwanym StringName jest stringname.length - 1. Jeśli indeks dostarczany jest poza zasięgiem, JavaScript zwraca pusty ciąg .

3
Matt 23 listopad 2011, 15:27

Aby odpowiedzieć na zmodyfikowane pytanie (lub co myślę, że pytanie):

Jeśli zmienna jest niezdefiniowana lub nie typu string, a następnie .charAt nie powiedzie się.

Zrób coś takiego

if (typeof s == "string") {
    switch(s) {
        //...
    }
}
2
Alex Turpin 23 listopad 2011, 15:33