Dichiarazione di più variabili in JavaScript


334

In JavaScript, è possibile dichiarare più variabili come questa:

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

... o così:

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

Un metodo è migliore / più veloce dell'altro?


6
Per quanto riguarda più velocemente , usando questo jsperf non ho potuto vedere un consistente aumento di velocità usando un metodo o l'altro.
Majid Fouladpour,

Risposte:


345

Il primo modo è più facile da mantenere. Ogni dichiarazione è una singola istruzione su una singola riga, quindi puoi facilmente aggiungere, rimuovere e riordinare le dichiarazioni.

Con il secondo modo, è fastidioso rimuovere la prima o l'ultima dichiarazione perché contengono la varparola chiave e il punto e virgola. E ogni volta che aggiungi una nuova dichiarazione, devi cambiare il punto e virgola nella vecchia riga in una virgola.


67
Se stai scrivendo codice che prevedi di minimizzare o comprimere in un secondo momento, il secondo modo consente ai compressori (come il compressore YUI) di offrirti una versione più minimizzata. Se la dimensione è una considerazione, suggerirei di seguire il maggior numero possibile di suggerimenti di JSLint.
Lane,

36
jslint afferma che la seconda via è più giusta ma non sono d'accordo.
ThatGuy

29
Il secondo modo è una micro-ottimizzazione. Tutte le dichiarazioni var vengono elaborate contemporaneamente, anziché una alla volta. Questo non ha molta importanza nei browser moderni / computer moderni.
webnesto,

18
@ 0xc0de: Vorrei vedere la prova di dichiarare "efficienti" tutte le variabili in una frase. Se stai misurando l'efficienza solo in base ai pochi byte salvati, allora forse. Ma se prendi in considerazione la leggibilità e la manutenibilità, penso che scoprirai che l'ottimizzazione prematura è di solito la strada sbagliata, soprattutto perché i browser moderni raccolgono e inizializzano tutte le variabili in un ambito in un passaggio pre-esecuzione. Personalmente, trovo che tutte le variabili siano dichiarate in un'unica riga o istruzione per rendere più rapida la comprensione del codice più difficile e più soggetta a errori.
ogradyjd,

9
Per quanto riguarda l'efficienza, sia uglifyjs che il compilatore di chiusura di Google comprimeranno automaticamente le istruzioni var sequenziali in una sola, trasformando quel punto controverso (per quanto posso dire YUI non lo farà, tuttavia non ho testato ampiamente).
bhuber,

215

Oltre alla manutenibilità, il primo modo elimina la possibilità di creazione di variabili globali accidentali:

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

Mentre il secondo modo è meno indulgente:

(function () {
var variable1 = "Hello World!" // comma is missed out accidently
    variable2 = "Testing...", // becomes a global variable
    variable3 = 42; // a global variable as well
}());

4
Buon punto. Se sono brevi, quindi scrivere su una singola linea eviterà questo problema: var variable1 = "Hello World!", variable2 = "Testing...", variable3 = 42;. Una mancanza ,si schianterà, ma sono d'accordo che è rischioso
Aram Kocharyan il

14
Se stai utilizzando la modalità rigorosa, non sarai in grado di creare comunque globi come questo.
Danyal Aytekin,

1
Sono un fan di dichiarare più variabili su una sola riga perché penso che appaia più pulito. Detto questo, dichiarare accidentalmente le variabili globali è un vero pericolo. Durante la ricerca di perdite di memoria mi sono imbattuto in più casi in cui ho accidentalmente dichiarato più variabili globali contemporaneamente perché ho usato un punto e virgola anziché una virgola.
smabbott,

+1 ha appena trascorso la metà della giornata e ha persino iniziato a chiedersi perché ci sia una differenza non documentata tra queste due dichiarazioni. Quindi leggi questa risposta, controlla il codice con molta attenzione e trova l'errore. Hai bisogno di una vacanza ...
Giedrius,

1
Il mio editor di testo mi dà un messaggio Possible Fatal Errorse mi manca un coma, evviva per me!

33

E 'comune l'uso di una vardichiarazione per ogni ambito per l'organizzazione. Il modo in cui tutti gli "ambiti" seguono un modello simile, rendendo il codice più leggibile. Inoltre, il motore li "solleva" comunque tutti verso l'alto. Quindi tenere insieme le dichiarazioni imita ciò che accadrà effettivamente più da vicino.


6
È possibile tenere insieme le dichiarazioni senza farle condividere la stessa dichiarazione 'var'. Comprendo e accetto le spiegazioni fornite su jslint (il tuo link) ma non condivido la conclusione. Come detto sopra, è più questione di stile che altro. Nel mondo Java (tra gli altri), per la leggibilità si consiglia il contrario (una dichiarazione per riga).
PhiLho,

Più leggibile? L'unico motivo per cui le persone li mettono su una riga è il motivo specifico di JS che hai citato: JS sposta tutte le dichiarazioni in alto. Se ciò non avvenisse, dichiareremmo tutti i nostri più vicini al punto in cui vengono utilizzati.
Danyal Aytekin,

@ vol7ron che non è il caso, ed è un grave fraintendimento vardell'affermazione. l 'esatto opposto e vero. vedere la documentazione e questo esempio
jackweirdy,

@jackweirdy hai ragione ed è stato il caso, una cattiva implementazione o un bug nei browser più vecchi. Da allora ho cancellato il mio commento.
vol7ron,

29

È molto più leggibile quando lo fai in questo modo:

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

Ma occupa meno spazio e righe di codice in questo modo:

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

Può essere ideale per risparmiare spazio, ma lascia che i compressori JavaScript lo gestiscano per te.


15

Forse così

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

Tranne quando si cambia la prima o l'ultima variabile, è facile da mantenere e leggere.


6
In genere, utilizzando la virgola prima, il punto e virgola passa a una nuova riga per evitare tale problema. var variabile1 = "ciao mondo" \ n, variabile2 = 2 \ n, variabile3 = "come stai" \ n, variabile4 = 42 \ n; \ n
BrianFreud

2
Questa è la sintassi di Haskell. Sento che in qualche modo non è raccomandato / pratica comune in javascript
shamanSK

14

È solo una questione di preferenze personali. Non vi è alcuna differenza tra questi due modi, a parte alcuni byte salvati con il secondo modulo se si rimuove lo spazio bianco.


Il secondo salva un paio di byte.
Sophie Alpert,

Ben Alpert: Come immagini?
Josh Stodola,

Se estrai lo spazio bianco, di 'var foo = "ciao", bar = "mondo";' la dichiarazione occupa meno caratteri di 'var foo = "hello"; var bar = "world";' Se hai un sito popolare, il salvataggio di alcuni byte su JS può essere d'aiuto (vorrai anche ridurre al minimo i nomi delle variabili, ecc.)
Brian Campbell

Vedo questo i byte salvati come irrilevanti in questo momento, a causa dell'ascesa dei minificatori JavaScript, in particolare la modalità semplice (cosiddetta) del compilatore di Google Closer.
Bryan Field,

1
@webnesto non c'è mai alcuna prestazione dalla sintassi quando la semantica della sintassi è la stessa. Uno non eseguirà immediatamente il codice ma prima lo analizzerà e farà un'analisi semantica - qui è dove entrambi gli stili di dichiarazione sono equalizzati.
Esailija,

14

ECMAScript6 ha introdotto un incarico di destrutturazione che funziona piuttosto bene:

[a, b] = [1, 2] asarà uguale 1e bsarà uguale 2.


non risponde alla domanda, ma può essere un'alternativa migliore ad entrambi gli approcci descritti.
svarog,

1
Penso che il tuo approccio non sia realmente praticabile nel caso in cui tu abbia lunghi elenchi di variabili. È difficile dire a quale variabile sia correlato il valore e inoltre non si ha protezione dagli errori è un caso di unione errata durante la quale è possibile rimuovere accidentalmente un elemento da un array. Esempio: let [aVar, bVar, cVar, xVar, yVar, zVar] = [10, 20, 30, 40, 50]; quindi personalmente non lo consiglio.
Kirill Reznikov,

1
utile se si desidera impostare molte variabili con gli stessi valori. Usando per reimpostare a zero in un loop per esempio.
Nick,

Sì! questo è quello che stavo cercando. Soprattutto se si desidera definire una coppia bidimensionale, o valori multidimensionali, ma non array.
Eugene Kardash,

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

è più leggibile di:

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

Ma fanno la stessa cosa.


Utilizza meno "spazio per i file"? Penso che tu abbia qualche spiegazione da fare.
Josh Stodola,

@JoshStodola mi sembra lo stesso spazio file. Da piuttosto che var<space>, è<space><space><space><space>
WORMSS

@WORMSS meno che non sia var<space>o var<tab>contro <tab>. Ancora in gran parte discutibile.
mpag,

9

Usa assegnazione di distruzione ES6 : decomprimerà i valori dagli array o le proprietà dagli oggetti in variabili distinte.

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

console.log(variable1); // Hello World!
console.log(variable2); // Testing...
console.log(variable3); // 42


4
È un'idea terribile, soprattutto se devi assegnare circa 10 variabili.
Kirill Reznikov

7

Il mio unico, ma essenziale uso per la virgola è in un ciclo for:

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

Sono andato qui per cercare se questo è OK in JavaScript.

Anche vedendolo funzionare, è rimasta una domanda se n sia locale alla funzione.

Questo verifica, n è locale:

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");

Per un momento non ne ero sicuro, passando da una lingua all'altra.


7

Sebbene entrambi siano validi, l'uso del secondo scoraggia gli sviluppatori inesperti dal posizionare dichiarazioni var ovunque e causare problemi di sollevamento. Se esiste solo una var per funzione, nella parte superiore della funzione, è più facile eseguire il debug del codice nel suo insieme. Ciò può significare che le righe in cui sono dichiarate le variabili non sono così esplicite come alcuni potrebbero piacere.

Sento che ne è valsa la pena, se ciò vuol dire che uno sviluppatore deve liberare 'var' ovunque si sentano.

Le persone possono lamentarsi di JSLint, lo faccio anche io, ma molte di queste sono orientate non a risolvere problemi con la lingua, ma a correggere cattive abitudini dei programmatori e quindi a prevenire problemi nel codice che scrivono. Perciò:

"Nelle lingue con ambito di blocco, di solito si consiglia di dichiarare le variabili nel sito del primo utilizzo. Ma poiché JavaScript non ha un ambito di blocco, è più saggio dichiarare tutte le variabili di una funzione nella parte superiore della funzione. È ha raccomandato di utilizzare una singola istruzione var per funzione. " - http://www.jslint.com/lint.html#scope


6

Penso che sia una questione di preferenze personali. Preferisco farlo nel modo seguente:

   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 */;

6

Un altro motivo per evitare la versione della singola istruzione (single var ) è il debug. Se viene generata un'eccezione in una qualsiasi delle righe di assegnazione, la traccia dello stack mostra solo una riga.

Se hai definito 10 variabili con la sintassi della virgola non hai modo di sapere direttamente quale fosse il colpevole.

La versione dell'istruzione individuale non soffre di questa ambiguità.


2

Il concetto di "coesione rispetto all'accoppiamento" può essere applicato più in generale di semplici oggetti / moduli / funzioni. Può anche servire in questa situazione:

Il secondo esempio suggerito dall'OP ha accoppiato tutte le variabili nella stessa istruzione, il che rende impossibile prendere una delle linee e spostarla da qualche altra parte senza rompere le cose (accoppiamento elevato). Il primo esempio che ha fornito rende le assegnazioni variabili indipendenti l'una dall'altra (accoppiamento basso).

"Il basso accoppiamento è spesso un segno di un sistema informatico ben strutturato e di un buon design e, se combinato con elevata coesione, supporta gli obiettivi generali di alta leggibilità e manutenibilità".

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

Quindi scegli il primo.


1
Non riesco a vedere come questo sia legato all'accoppiamento o alla coesione. Ti interessa elaborare?
Edson Medina,

Il secondo esempio suggerito dall'OP ha accoppiato tutte le variabili nella stessa istruzione, il che rende impossibile prendere una delle linee e spostarla da qualche altra parte senza rompere le cose (accoppiamento elevato). Il primo esempio che ha fornito rende le assegnazioni variabili indipendenti l'una dall'altra (accoppiamento basso).
Magne,

L'accoppiamento riguarda l'interdipendenza tra diversi moduli / oggetti / funzioni, NON righe di codice!
Edson Medina,

1
Inizialmente si trattava di moduli, sì, ma il concetto può essere applicato più in generale, come mostra anche la tua inclusione di oggetti / funzioni nella definizione.
Magne,

2

Un vecchio post, lo so, ma per aggiungere un piccolo dettaglio di prospettiva per gli altri googler:

Il problema della manutenibilità può essere facilmente risolto con un po 'di formattazione, come tale.

let
  my_var1 = 'foo',
  my_var2 = 'bar',
  my_var3 = 'baz'
;

Uso questa formattazione rigorosamente come una questione di preferenze personali. Salto questo formato per singole dichiarazioni, ovviamente, o dove semplicemente gengive le opere.


1

Credo che prima di iniziare a usare ES6, l'approccio con una singola dichiarazione var non era né buono né cattivo (nel caso in cui si avesse linters e 'use strict'. Era davvero la preferenza del gusto. Ma ora le cose sono cambiate per me. Ci sono i miei pensieri a favore della dichiarazione multilinea :

  1. Ora abbiamo due nuovi tipi di variabili e siamo vardiventati obsoleti. È buona norma utilizzare constovunque fino a quando non è realmente necessario let. Molto spesso il tuo codice conterrà dichiarazioni di variabili con assegnazione nel mezzo del codice e, a causa dell'ambito dei blocchi, molto spesso sposterai le variabili tra i blocchi in caso di piccole modifiche. Penso che sia più conveniente farlo con dichiarazioni multilinea.

  2. La sintassi ES6 è diventata più varia, abbiamo distruttori, stringhe di template, funzioni freccia e assegnazioni opzionali. Quando si utilizza pesantemente tutte queste funzionalità con dichiarazioni var singole, si danneggia la leggibilità.


0

Penso che il primo modo (più variabili) sia il migliore, poiché altrimenti potresti finire con questo (da un'applicazione che usa Knockout), che a mio avviso è difficile da leggere:

    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;
        });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.