Znalazłem trzy sposoby na rzutowanie zmiennej String
w JavaScript.
Szukałem tych trzech opcji w kodzie źródłowym jQuery i wszystkie są w użyciu .
Chciałbym wiedzieć, czy są między nimi jakieś różnice:
value.toString()
String(value)
value + ""
Wszystkie wytwarzają tę samą moc wyjściową, ale czy jeden z nich jest lepszy od innych?
Powiedziałbym, że + ""
ma tę zaletę, że oszczędza niektóre postacie, ale to nie jest tak duża zaleta, coś jeszcze?
javascript
jquery
string
gdoron wspiera Monikę
źródło
źródło
toString()
byłaby droga.toString
jest to semantycznie najczystszy sposób na samodzielne udokumentowanie faktu, że próbujesz uzyskać łańcuchowy odpowiednik obiektu.String(...)
jest trochę tępy ivalue + ""
jest trochę hack. Daje to również możliwość zastąpienia domyślnejtoString
implementacji niestandardowej, jeśli zajdzie taka potrzeba, jako niewielka dodatkowa korzyść.+ ""
jest najszybszy według jsperf, więc ... robi to w inny sposób, jak sądzę.Odpowiedzi:
Zachowują się inaczej, gdy
value
jestnull
.null.toString()
zgłasza błąd - Nie można wywołać metody „toString” o wartości nullString(null)
zwraca - „null”null + ""
zwraca również - „null”Bardzo podobne zachowanie ma miejsce, jeśli
value
jestundefined
(patrz odpowiedź jbabey ).Poza tym istnieje niewielka różnica w wydajności, o ile nie używasz ich w dużych pętlach, nie warto się martwić.
źródło
toString()
gdy jeszcze tego nie sprawdziłeśnull
.null
lubundefined
wyświetlanie na ekranie jest bardziej pożądanym zachowaniem, niż błąd javascript ...v + ''
zwraca niepoprawny wynik, jeśli v ma zarówno metody toString (), jak i valueOf (). Łączenie zignoruje toString () i użyje valueOf (). Przykład klasy, w przypadku której konkatenacja nie powiodła się: github.com/processing-js/processing-js/blob/…Istnieją różnice, ale prawdopodobnie nie mają związku z twoim pytaniem. Na przykład prototyp toString nie istnieje na niezdefiniowanych zmiennych, ale można rzutować niezdefiniowany na ciąg, używając dwóch pozostałych metod:
http://jsfiddle.net/f8YwA/
źródło
String()
. Przykład:String(test);
rzucaUncaught ReferenceError: test is not defined
, avar test; String(test);
spowoduje"undefined"
.Zachowują się tak samo, ale
toString
zapewniają także konwersję ciągów binarnych, ósemkowych lub szesnastkowych:Przykład:
źródło
Według tego testu JSPerf różnią się prędkością. Ale chyba, że zamierzasz używać ich w dużych ilościach, każdy z nich powinien działać dobrze.
Dla kompletności: Jak już wspomniano jako prawnik , możesz również użyć tej
.toString()
metody.źródło
new String()
zwraca obiekt, który nie jestString
new String()
zwraca obiekt tak.String()
zwraca jednak ciąg, który jest tym w pytaniu.new String(blarg)
daje ciString
obiekt, do którego możesz zadzwonićtoString()
. W moim debuggerze Chrome skutecznie dają ten sam obiekt, z wyjątkiem wspomnianej różnicy.Oprócz wszystkich powyższych należy zauważyć, że dla określonej wartości
v
:String(v)
połączeniav.toString()
'' + v
połączeniav.valueOf()
przed jakimkolwiek innym typem obsadyWięc możemy zrobić coś takiego:
Testowane w FF 34.0 i węźle 0.10
źródło
jeśli jesteś w porządku z zerami, niezdefiniowanymi, NaN, 0 i false wszystkie rzutowania na „”, to
(s ? s+'' : '')
jest szybsze.patrz http://jsperf.com/cast-to-string/8
Uwaga - w tej chwili istnieją znaczne różnice między przeglądarkami.
źródło
Świat realny przykład: Mam funkcję dziennika, który można nazwać z dowolnej liczby parametrów:
log("foo is {} and bar is {}", param1, param2)
. JeśliDEBUG
flaga jest ustawiona natrue
, nawiasy zastępowane są podanymi parametrami, a ciąg jest przekazywany doconsole.log(msg)
. Parametry mogą i będą ciągami, liczbami i czymkolwiek, co może zostać zwrócone przez wywołania JSON / AJAX, a może nawetnull
.arguments[i].toString()
nie jest opcją ze względu na możliwenull
wartości (patrz odpowiedź Connell Watkins)arguments[i] + ""
. To może, ale nie musi, wpływać na decyzję o tym, czego użyć. Niektórzy ludzie ściśle przestrzegają JSLint.źródło
Na tej stronie możesz samodzielnie przetestować działanie każdej metody :)
http://jsperf.com/cast-to-string/2
tutaj na wszystkich komputerach i przeglądarkach „ ” „+ str ” jest najszybszy, a (String) str jest najwolniejszy
źródło