Deklarowanie wielu zmiennych w JavaScript

W JavaScript Można zadeklarować wiele zmiennych w następujący sposób:

var variable1 = "Hello World!";
var variable2 = "Testing...";
var variable3 = 42;

...albo tak:

var variable1 = "Hello World!",
    variable2 = "Testing...",
    variable3 = 42;

Czy jedna metoda jest lepsza / szybsza od drugiej?

Author: Drew Gaynor, 2009-03-29

16 answers

Pierwszy sposób jest łatwiejszy w utrzymaniu. Każda deklaracja jest pojedynczą deklaracją w jednej linii, dzięki czemu można łatwo dodawać, usuwać i zmieniać kolejność deklaracji.

Przy drugim sposobie, irytujące jest usunięcie pierwszej lub ostatniej deklaracji, ponieważ zawierają one słowo kluczowe var i średnik. I za każdym razem, gdy dodajesz nową deklarację, musisz zmienić średnik w starej linii na przecinek.

 292
Author: Jeremy Ruten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-29 05:40:36

Oprócz możliwości utrzymania, pierwszy sposób eliminuje możliwość tworzenia zmiennych globalnych przypadkowych:

(function () {
var variable1 = "Hello World!" // semicolon is missed out accidently
var variable2 = "Testing..."; // still a local variable
var variable3 = 42;
}());

Podczas gdy druga droga jest mniej wyrozumiała:

(function () {
var variable1 = "Hello World!" // comma is missed out accidently
    variable2 = "Testing...", // becomes a global variable
    variable3 = 42; // a global variable as well
}());
 192
Author: Kenny Ki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-12 07:23:18

Powszechnie używa się jednej deklaracji var Na Zakres dla organizacji. Sposób, w jaki wszystkie "zakresy" podążają za podobnym wzorcem, czyniąc kod bardziej czytelnym. Dodatkowo silnik i tak" wciąga " je wszystkie do góry. Więc trzymanie deklaracji razem naśladuje to, co faktycznie się wydarzy.

 33
Author: spencer.sm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-25 21:03:14

Jest o wiele bardziej czytelny, gdy robi to w ten sposób:

var hey = 23;
var hi = 3;
var howdy 4;

Ale zajmuje mniej miejsca i linii kodu w ten sposób:

var hey=23,hi=3,howdy=4;
Może być idealny do oszczędzania miejsca, ale pozwól sprężarkom JavaScript zająć się tym za Ciebie.
 22
Author: Jason Stackhouse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-24 09:33:17

To tylko kwestia osobistych preferencji. Nie ma różnicy między tymi dwoma sposobami, poza kilkoma bajtami zapisanymi w drugiej postaci, jeśli usuniesz białą spację.

 13
Author: Brian Campbell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-29 04:46:43
var variable1 = "Hello World!";
var variable2 = "Testing...";
var variable3 = 42;

Jest bardziej czytelny niż:

var variable1 = "Hello World!",
    variable2 = "Testing...",
    variable3 = 42;
Ale robią to samo.
 10
Author: Kevin Crowell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-29 04:43:57

Maybe like this

var variable1 = "hello world"
, variable2 = 2
, variable3 = "how are you doing"
, variable4 = 42;

Z wyjątkiem zmiany pierwszej lub ostatniej zmiennej jest łatwa w utrzymaniu i odczycie.

 10
Author: joe nerdan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-19 14:00:43

Moje jedyne, ale niezbędne użycie przecinka jest w pętli for:

for (var i = 0, n = a.length; i < n; i++) {
  var e = a[i];
  console.log(e);
}

Poszedłem tutaj, aby sprawdzić, czy to jest OK w JavaScript.

Nawet widząc to działa, pozostaje pytanie, czy n jest lokalne dla funkcji.

To sprawdza, N jest lokalne:

a=[3,5,7,11];
(function l () { for (var i = 0, n = a.length; i < n; i++) {
  var e = a[i];
  console.log(e);
}}) ();
console.log(typeof n == "undefined" ?
  "as expected, n was local" : "oops, n was global");

Przez chwilę nie byłem pewien, przełączanie między językami.

 7
Author: codelion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-08 04:52:28

ECMAScript6 destrukcyjne przypisanie które działa całkiem nieźle:

[a, b] = [1, 2] a będzie równa 1 i {[2] } będzie równa 2.

 7
Author: Nir Naor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-21 14:36:52

Chociaż oba są poprawne, użycie drugiego zniechęca niedoświadczonych programistów do umieszczania instrukcji var wszędzie i powodowania problemów z podnoszeniem. Jeśli w górnej części funkcji jest tylko jeden var dla danej funkcji, wtedy łatwiej jest debugować kod jako całość. Może to oznaczać, że linie, w których deklarowane są zmienne, nie są tak jawne, jak niektórzy mogą sobie tego życzyć.

Uważam, że warto, jeśli oznacza to odstawienie dewelopera od porzucenia " var " w dowolnym miejscu, w którym się czuje na przykład.

Ludzie mogą narzekać na JSLint, ja również, ale wiele z nich jest nastawionych nie na naprawianie problemów z językiem, ale na korygowanie złych nawyków programistów i tym samym zapobieganie problemom w kodzie, który piszą. Dlatego:

" w językach z zakresem blokowym zwykle zaleca się zadeklarowanie zmiennych w miejscu pierwszego użycia. Ale ponieważ JavaScript nie ma zakresu blokowego, rozsądniej jest zadeklarować wszystkie zmienne funkcji na górze funkcja. Zaleca się użycie pojedynczej instrukcji var dla każdej funkcji."- http://www.jslint.com/lint.html#scope

 5
Author: Wade Harrell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-08 17:37:57

Myślę, że to kwestia osobistych preferencji. Wolę to zrobić w następujący sposób:

   var /* Vars */
            me = this, that = scope,
            temp, tempUri, tempUrl,
            videoId = getQueryString()["id"],
            host = location.protocol + '//' + location.host,
            baseUrl = "localhost",
            str = "Visit W3Schools",
            n = str.search(/w3schools/i),
            x = 5,
            y = 6,
            z = x + y
   /* End Vars */;
 4
Author: v1r00z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-10 17:02:59

Użyj ES6 przypisanie destrukcji : rozpakuje wartości z tablic lub właściwości z obiektów do odrębnych zmiennych.

let [variable1 , variable2, variable3] = 
["Hello World!", "Testing...", 42];

console.log(variable1); // Hello World!
console.log(variable2); // Testing...
console.log(variable3); // 42
 4
Author: Rohit Jindal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-25 07:43:30

Pojęcie "spójność nad sprzężeniem" może być stosowane bardziej ogólnie niż tylko obiekty / Moduły / funkcje. Może również służyć w tej sytuacji:

Drugi przykład, który zasugerował OP, połączył wszystkie zmienne w jedną instrukcję, co uniemożliwia wzięcie jednej z linii i przeniesienie jej w inne miejsce bez łamania rzeczy (high coupling). Pierwszy podany przez niego przykład sprawia, że przypisania zmiennych są niezależne od siebie (niskie sprzężenie).

" low coupling is często znak dobrze zorganizowanego systemu komputerowego i dobrego projektu, a w połączeniu z wysoką spójnością, wspiera ogólne cele wysokiej czytelności i łatwości konserwacji."

Http://en.wikipedia.org/wiki/Coupling_ (computer_programming)

Więc wybierz pierwszy.

 3
Author: Magne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-21 10:45:07

Innym powodem unikania wersji pojedynczej instrukcji (single var) jest debugowanie. Jeśli w linii przypisania zostanie wyrzucony wyjątek, ślad stosu pokazuje tylko jedną linię.

Jeśli miałeś 10 zmiennych zdefiniowanych za pomocą składni przecinka, nie możesz bezpośrednio wiedzieć, która z nich była winowajcą.

Indywidualna wersja instrukcji nie cierpi z powodu tej dwuznaczności.

 2
Author: shawn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-10 17:17:57

Uważam, że zanim zaczęliśmy używać ES6, podejście z pojedynczą deklaracją var nie było ani dobre, ani złe (w przypadku, gdy masz lintery i 'use strict'. To było naprawdę preferencje smakowe. Ale teraz wszystko się zmieniło. Są moje myśli za deklaracją wielowierszową:

  1. Teraz mamy dwa nowe rodzaje zmiennych i var stały się przestarzałe. Dobrą praktyką jest używanie const wszędzie, dopóki naprawdę nie potrzebujesz let. Więc dość często Twój kod będzie zawierał deklaracje zmiennych z assigment w środku kodu, a ze względu na zasięg bloków dość często będziesz przenosić zmienne między blokami w przypadku małych zmian. Myślę, że bardziej wygodne jest robienie tego z deklaracjami wielowierszowymi.

  2. Składnia ES6 stała się bardziej zróżnicowana, mamy destruktory, ciągi szablonów, funkcje strzałek i opcjonalne assigmenty. Gdy mocno używasz wszystkich tych funkcji z pojedynczymi deklaracjami var, szkodzi to czytelności.

 1
Author: Kirill Reznikov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-15 22:26:47

Myślę, że pierwszy sposób (multiple vars) jest najlepszy, ponieważ można w przeciwnym razie skończyć z tym (z aplikacji, która używa Knockout), co jest moim zdaniem trudne do odczytania:

    var categories = ko.observableArray(),
        keywordFilter = ko.observableArray(),
        omniFilter = ko.observable('').extend({ throttle: 300 }),
        filteredCategories = ko.computed(function () {
            var underlyingArray = categories();
            return ko.utils.arrayFilter(underlyingArray, function (n) {
                return n.FilteredSportCount() > 0;
            });
        }),
        favoriteSports = ko.computed(function () {
            var sports = ko.observableArray();
            ko.utils.arrayForEach(categories(), function (c) {
                ko.utils.arrayForEach(c.Sports(), function (a) {
                    if (a.IsFavorite()) {
                        sports.push(a);
                    }
                });
            });
            return sports;
        }),
        toggleFavorite = function (sport, userId) {
            var isFavorite = sport.IsFavorite();

            var url = setfavouritesurl;

            var data = {
                userId: userId,
                sportId: sport.Id(),
                isFavourite: !isFavorite
            };

            var callback = function () {
                sport.IsFavorite(!isFavorite);
            };

            jQuery.support.cors = true;
            jQuery.ajax({
                url: url,
                type: "GET",
                data: data,
                success: callback
            });
        },
        hasfavoriteSports = ko.computed(function () {
            var result = false;
            ko.utils.arrayForEach(categories(), function (c) {
                ko.utils.arrayForEach(c.Sports(), function (a) {
                    if (a.IsFavorite()) {
                        result = true;
                    }
                });
            });
            return result;
        });
 0
Author: vegemite4me,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-27 11:15:54