Definicja zmiennej JavaScript: przecinki a średniki

88

Jakie są różnice i / lub zalety używania przecinków podczas deklarowania grupy zmiennych zamiast średników.

Na przykład:

var foo = 'bar', bar = 'foo';

przeciw

var foo = 'bar';
var bar = 'foo';

Wiem, że jeśli określisz varsłowo kluczowe na pierwszej zmiennej w pierwszym przykładzie, będzie ono obowiązywać we wszystkich zmiennych, więc obie dają ten sam wynik końcowy pod względem zakresu. Czy to tylko osobiste preferencje, czy też jest to korzystne dla wydajności?

Collin Klopfenstein
źródło

Odpowiedzi:

72

Brak korzyści w zakresie wydajności, tylko kwestia osobistego wyboru i stylu.

Pierwsza wersja jest po prostu bardziej zwięzła.


Aktualizacja:

Jeśli chodzi o ilość danych przesyłanych przez sieć, oczywiście mniej znaczy lepiej, jednak varaby zobaczyć rzeczywisty wpływ, potrzebowałbyś ogromnej ilości usuniętych deklaracji.

Minifikacja została wymieniona jako coś, w czym pierwszy przykład pomoże w lepszej minifikacji, jednak, jak Daniel Vassallo wskazuje w komentarzach, dobry minifier i tak zrobi to automatycznie, więc pod tym względem nie ma żadnego wpływu.

Oded
źródło
8
Minimalizacja kodu javascript ma wpływ na wydajność.
Ryan Kinal
1
@Ryan Kinal - gdzie dokładnie w pytaniu wspomniano o minifikacji?
Oded
2
@Oded - minifikacja jest zgodna z problemami dotyczącymi wydajności. Dlatego, jeśli jeden styl nadaje się do lepszej minifikacji, to pośrednio wiąże się z problemami z wydajnością
STW
7
@Ryan: Dobre minifiers, takie jak Google Closure Compiler, połączą wiele instrukcji var w jedno: img840.imageshack.us/img840/3601/closurecompilerservice.jpg
Daniel Vassallo
2
Tak masz rację. Z ciekawości stworzyłem test ( jsperf.com/… ), uruchomiłem go 5 razy i otrzymałem 5 różnych odpowiedzi. Tak więc, tak, wszystko zależy od stylu i osobistych preferencji, a nie o wydajności.
Derek Henderson
29

Po przeczytaniu Crockforda i innych zacząłem łączyć moje zmienne wyłącznie z przecinkami. Później naprawdę zirytował mnie debugger Chrome DevTools, który nie zatrzymywał się na definicjach zmiennych przecinkiem. W przypadku debugera definicje zmiennych połączone przecinkami to pojedyncza instrukcja, podczas gdy wiele instrukcji var to wiele instrukcji, na których debugger może się zatrzymać. Dlatego wróciłem z:

var a = doSomethingA,
    b = doSomethignB,
    c = doSomethingC;

Do:

var a = doSomethingA;
var b = doSomethignB;
var c = doSomethingC;

Do tej pory uważam, że drugi wariant jest znacznie czystszy, nie wspominając o jego zaletach w rozwiązaniu problemu z debugerem.

Argument „mniej kodu w sieci” nie jest przekonujący, ponieważ istnieją pomniejszacze.

Felix
źródło
1
Sam tego doświadczyłem. Zwykle po prostu dzielę deklarację, w której muszę coś sprawdzić, i wrzucam debuggertam, a następnie dodaję kolejną vari nadal łączę je przecinkami. Następnie, gdy skończę debugowanie, wracam i usuwam pliki debuggeri dodatkowe var.
Collin Klopfenstein
7
Drugi wariant sprawia, że ​​historia git jest czystsza. Zamiast zamieniać końcowy średnik na przecinek przed dodaniem kolejnej zmiennej lub ryzykować utworzenie zmiennej globalnej, wystarczy dodać pełną instrukcję var.
payne8
żeby wspomnieć, pierwsza forma może błędnie sprawić, że myślisz, że b lub c jest globalne.
garg10 może
18

Wolę var-per-variablenotację:

var a = 2
var b = 3

ponieważ druga comma-instead-of-another-varnotacja ma te trzy wady:

1. Trudne w utrzymaniu
Rozważ ten kod:

var a = 1,
    b = mogrify(2),
    c = 3

Ale hej, co robi mogrify? Wydrukujmy b, aby dowiedzieć się:

var a = 1,
    b = mogrify(2),
    console.log(b)
    c = 3

niszczy rzeczy

2. Trudne do odczytania

Zmienna na początku linii jasno informuje, że zostanie zainicjowana nowa zmienna.

var get_all_unicorn_promise = db.get_all_unicorns((unicorn) => {
        unicorn.legs.map((leg) => {
            leg.log('yes')
        })
    }).sort(),
    c = 3

Co tam do cholery c = 3robi, prawda?

3. Niespójne

Rozważ to:

var a = 1,
    b = 2,
    c = 3

Przy var-per-variablekażdym zgłoszeniu zgodnie z tą samą strukturę. Z comma-instead-of-another-varpierwszą zmienną deklaruje się inaczej niż pozostałe. Jeśli zdecydujesz się, powiedzmy, przenieść pierwszą zmienną wewnątrz cyklu for, będziesz musiał dodać zmienną do środka deklaracji

Poza preferencjami wydaje się, że większość znaczących projektów używa var-per-variablenotacji

Martin Gottweis
źródło
przykład tego brzydkiego stylu (przecinek-zamiast-inny-zmienny) robi to i dezorientuje ludzi, zobacz stackoverflow.com/questions/37332155/ ...
Scott Weaver
7

Zgadzam się z innymi respondentami, że jest to głównie kwestia osobistego stylu. Aby jednak wnieść do dyskusji opinię „autorytatywną”, oto co mówi Douglas Crockford na stronie internetowej popularnego narzędzia JSLint :

Ponieważ jednak JavaScript nie ma zakresu blokowego, rozsądniej jest zadeklarować wszystkie zmienne funkcji na początku funkcji. Zaleca się użycie jednej instrukcji var na funkcję. Można to wymusić za pomocą onevaropcji.

Daniel Vassallo
źródło
6
Warto może dodać, że Mozilla JavaScript (przez letkonstruktu) ma mieć zakres bloku.
BlackVegetable
3
@BlackVegetable letmożna używać nie tylko w Mozilli JS ( patrz tutaj ). Jest to część specyfikacji ES6 , ale większość przeglądarek nadal pracuje nad implementacją funkcji ES6.
mbomb007
3

Jak zauważyli inni, jest to preferencja stylu. JSLint może powiedzieć, że masz tylko jedną varna funkcję (jeśli używasz „dobrych części”). Tak więc, jeśli używasz JSLint do sprawdzenia swojego kodu (niezły pomysł, IMHO), skończysz używać pierwszego formatu częściej niż drugiego.

Z drugiej strony ten sam autor, Douglas Crockford , mówi, że każdą zmienną należy umieścić w osobnym wierszu w swoich konwencjach kodowania . Dlatego możesz odznaczyć pole wyboru „Wszystkie po jednym varna funkcję” w JSLint, jeśli go używasz. ;-)

Heretic Monkey
źródło
1
On ma rację. Umieszczanie zmiennych w oddzielnych wierszach jest zalecane w większości języków, ponieważ algorytmy scalania kontroli źródła zazwyczaj działają na zasadzie porównywania każdego wiersza jako zwykłego tekstu (a nie instrukcji leksykalnych w wierszu). Jeśli dwie osoby edytują tę samą funkcję, zadeklarowanie wielu zmiennych w tej samej linii prawie na pewno spowoduje konflikt scalania, podczas gdy oddzielne wiersze prawie zawsze mogą być scalane automatycznie. (Bez względu na to, czy zostały zadeklarowane jako oddzielne varoświadczenia, czy połączone przecinkami.)
Richard Dingwall,
2

Nie sądzę, żeby była jakaś zauważalna różnica, jeśli o mnie chodzi, to tylko osobiste preferencje.

Nienawidzę mieć wielu deklaracji var, więc zwykle robię:

var 
   one
  ,two
  ,three
  ,four
;

Ponieważ jest krótszy i prawdopodobnie bardziej czytelny, nie ma varhałasu.

meder omuraliev
źródło
22
słowo kluczowe „prawdopodobnie”. Gdybym znalazł tę próbkę w naszej, stałoby się to var one, two, three four;bardzo szybko. Dodawanie wierszy-for-the-sake-of-linie w JavaScript mogą być niebezpieczne (tłumacze JS można wstawić własną rękę ;--if nie przewidujemy to wtedy szybko znajdziesz skutków ubocznych. Również, co ,„s bug mnie , wkurzają mnie słowa kluczowe pobierające własną linię, wkurzają mnie te słowa kluczowe ;. Czy
płacisz bezpośrednio
8
@STW - Sprawiasz, że automatyczne wstawianie średnika brzmi jak przypadkowa rzecz, podlegająca kaprysom poszczególnych przeglądarek, ale w rzeczywistości dzieje się to tylko zgodnie z dobrze zdefiniowanym zestawem reguł i nie musisz się martwić, że może się to zdarzyć w w połowie vardeklaracji. (Chociaż zgadzam się z tobą co do początkowych przecinków i varostatniego średnika znajdującego się w osobnych wierszach - wszystkie trzy też mnie wkurzają.)
nnnnnn
1
Nie sądzę, żeby to naprawdę odpowiadało na pytanie, ponieważ pytanie nie dotyczy osobistych preferencji.
Keith Pinson,
2

Ponieważ nie widzę żadnych odniesień do niego, oto link do specyfikacji ECMA-262, która jest podstawową specyfikacją dla JavaScript. Gramatyka z tej strony mówi:

12.2 Variable Statement

Syntax

  VariableStatement :
    var VariableDeclarationList ;

  VariableDeclarationList :
    VariableDeclaration
    VariableDeclarationList , VariableDeclaration

  VariableDeclarationListNoIn :
    VariableDeclarationNoIn
    VariableDeclarationListNoIn , VariableDeclarationNoIn

  VariableDeclaration :
    Identifier Initialiseropt

  VariableDeclarationNoIn :
    Identifier InitialiserNoInopt

  Initialiser :
    = AssignmentExpression
  InitialiserNoIn :
    = AssignmentExpressionNoIn

To, co możesz z tego wyciągnąć, to użycie przecinków lub nie ma to znaczenia. Tak czy inaczej, kończy się parsowaniem jako a VariableDeclarationi jest traktowany dokładnie tak samo. Nie powinno być różnicy w sposobie, w jaki silnik skryptów traktuje te dwie deklaracje. Jedynymi różnicami byłyby te, które zostały już wspomniane w innych odpowiedziach - oszczędność miejsca i praktycznie niewymierne różnice w ilości czasu potrzebnego na zastosowanie gramatyki, aby znaleźć wszystko, VariableDeclarationskiedy skrypt jest kompilowany.

Scott Mermelstein
źródło
1

Pierwsza oszczędza kilka znaków - więc jest bardzo mała oszczędność pod względem rozmiaru pliku JS, a tym samym zużycia przepustowości. Jedyny moment, w którym stałoby się to zauważalne, miałby miejsce w skrajnych przypadkach.

STW
źródło
Zakłada się, że nie minifikujesz swoich plików - i poważnie, kto nie minifikuje ich obecnie?
Keith Pinson,
1

Wolę drugą wersję (każda ma swoją var). Myślę, że to dlatego, że wywodzę się z C ++. W C ++ możesz deklarować zmienne, tak jak w pierwszym przykładzie, ale jest to źle widziane (łatwo prowadzi do błędów, gdy próbujesz utworzyć wskaźniki w ten sposób).

rmeador
źródło
1
Ciekawa uwaga, ale nie jestem pewien, czy to odpowiada na pytanie, jakie są rzeczywiste zalety i wady tej składni JavaScript .
Keith Pinson,
1

Jeśli minimalizujesz swój javascript, masz dość dużą korzyść:

var one, two, three, four;

staje się

var a, b, c, d;

Natomiast

var one;
var two;
var three;
var four;

staje się

var a;
var b;
var c;
var d;

To dodatkowe trzy przypadki var, które mogą się sumować w czasie.

Zobacz serię artykułów „Lista od siebie” „Lepsza minifikacja JavaScript” część 1 i część 2

Ryan Kinal
źródło
6
Dobre minifier, takie jak Google Closure Compiler, scalą wiele instrukcji var w jedną: img840.imageshack.us/img840/3601/closurecompilerservice.jpg . Dlatego ten argument jest ważny tylko wtedy, gdy używasz mniej inteligentnego minifier ... czego nie powinieneś :)
Daniel Vassallo
2
A jeśli gzipujesz, powtórzone var s nie zwiększą znacząco rozmiaru spakowanego pliku (jeśli dobrze rozumiem gzipowanie).
Paul D. Waite,