Wszyscy mówią, że jednym z problemów JavaScript jest użycie +
[ przykład ] do łączenia łańcuchów. Niektórzy twierdzą, że problem nie jest używany +
, jest to przymus typu [patrz komentarze z poprzedniego przykładu]. Jednak w przypadku silnie typowanych języków bezproblemowo używaj + do łączenia i wymuszania typów. Na przykład w języku C #:
int number = 1;
MyObject obj = new MyObject();
var result = "Hello" + number + obj;
// is equivalent to
string result = "hello" + number.ToString() + obj.ToString();
Dlaczego więc łączenie łańcuchów w JavaScript jest tak dużym problemem?
javascript
konfigurator
źródło
źródło
bad
. Kim jestEveryone
?Odpowiedzi:
Rozważ ten fragment kodu JavaScript:
To się zaloguje
Co najprawdopodobniej nie jest zamierzone i może być trudnym do wyśledzenia.
źródło
a
ib
wstr(a)
istr(b)
połączenia; w przeciwnym razie otrzymaszValueError: cannot concatenate 'str' and 'int'
.'result is ' + (a + b)
.System.Console.WriteLine("result is " + 10 + 20);
ale nikt nigdy nie narzeka na to w C #. Tego nie rozumiem - co takiego jest w JavaScript, co czyni go bardziej mylącym?Kiedy mówisz „zły”, masz na myśli „niepoprawny” czy „powolny”? Argument o używaniu operatorów matematycznych zrobić ciąg konkatenacji niewątpliwie jest „nieprawidłowy” Argument, ale jest również argument, że należy dokonać za pomocą
+
zrobić wiele z łańcuchów znaków może być bardzo powolne.Nie mówimy o tym,
"Hello" + number
kiedy mówimy o wydajności, mówimy o budowaniu stosunkowo dużego ciągu przez wielokrotne dołączanie do niego w pętli.W JavaScript (i C # jeśli o to chodzi) ciągi są niezmienne. Nigdy nie mogą być zmienione, tylko zastąpione innymi ciągami. Prawdopodobnie zdajesz sobie sprawę, że
combined + "hello "
nie modyfikuje bezpośredniocombined
zmiennej - operacja tworzy nowy ciąg, który jest wynikiem połączenia dwóch ciągów razem, ale musisz przypisać nowy ciąg docombined
zmiennej, jeśli chcesz ją zmienić.Ta pętla tworzy milion różnych obiektów łańcuchowych i wyrzuca 999 999 z nich. Utworzenie tak wielu ciągów, które ciągle się powiększają, nie jest szybkie, a teraz śmieciarz ma wiele do zrobienia, aby potem wyczyścić.
C # ma dokładnie ten sam problem, który jest rozwiązany w tym środowisku przez klasę StringBuilder . W JavaScript uzyskasz znacznie lepszą wydajność, budując tablicę wszystkich ciągów, które chcesz połączyć, a następnie łącząc je razem na końcu, zamiast miliona razy w pętli:
źródło
Nie jest źle używać + zarówno do dodawania, jak i konkatenacji, pod warunkiem, że można tylko dodawać liczby i tylko łańcuchy konkatenacji. Jednak Javascript automatycznie konwertuje między liczbami i łańcuchami w razie potrzeby, więc masz:
Być może prościej, przeciążenie „+” w obecności automatycznej konwersji typu przerywa oczekiwane skojarzenie operatora +:
źródło
3 + 5 == 5 + 3
ale"3" + "5" != "5" + "3"
Typowy problem związany z łączeniem łańcuchów dotyczy kilku zagadnień:
+
symbol przeciążenia# 1
Pierwszym i najważniejszym problemem związanym z używaniem
+
do łączenia i dodawania ciągów jest to, że używasz+
do łączenia i dodawania ciągów .jeśli masz zmienne
a
ib
ustawiłeśc = a + b
, to niejednoznaczność zależy od typówa
ib
. Ta dwuznaczność zmusza do podjęcia dodatkowych kroków w celu złagodzenia problemu:Concat String:
Dodanie:
To prowadzi mnie do drugiego punktu
# 2
Bardzo łatwo jest przypadkowo rzucić zmienną na ciąg, nie zdając sobie z tego sprawy. Łatwo jest również zapomnieć, że dane wejściowe pojawiają się w postaci ciągu:
Daje nieintuicyjne wyniki, ponieważ zachęta zwraca wartość ciągu wejściowego.
# 3
Potrzebowanie pisania
parseFloat
lub zaNumber()
każdym razem, gdy chcę to zrobić, jest żmudne i denerwujące. Uważam się za wystarczająco mądrego, aby pamiętać, że nie zepsuję moich dynamicznych typów, ale to nie znaczy, że nigdy nie zawiodłem moich dynamicznych typów . Prawda jest taka, że jestem zbyt leniwy, aby pisaćparseFloat
lub zaNumber()
każdym razem, gdy dodam, ponieważ robię dużo dodawania.Rozwiązanie?
Nie wszystkie języki używają
+
do łączenia łańcuchów. PHP używa.
do łączenia ciągów, co pomaga rozróżnić, kiedy chcesz dodać liczby, a kiedy chcesz połączyć ciągi.Do łączenia łańcuchów można użyć dowolnego symbolu, ale większość z nich jest już używana i najlepiej unikać duplikacji. Gdybym miał swoją drogę, prawdopodobnie użyłbym
_
do łączenia łańcuchów i nie zezwalałbym na_
nazwy zmiennych.źródło