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?
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.
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
}());
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.
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.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ę.
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.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.
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.
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.
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
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 */;
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
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.
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.
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ą:
Teraz mamy dwa nowe rodzaje zmiennych i
var
stały się przestarzałe. Dobrą praktyką jest używanieconst
wszędzie, dopóki naprawdę nie potrzebujeszlet
. 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.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.
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;
});
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