Javascript Comment définir plusieurs variables sur une seule ligne?


103

En lisant la documentation en ligne, je ne comprends pas comment définir correctement plusieurs variables JavaScript sur une seule ligne.

Si je veux condenser le code suivant, quel est le moyen JavaScript "strict" approprié pour définir plusieurs variables javascript sur une seule ligne?

var a = 0;
var b = 0;

Est-ce:

var a = b = 0;

ou

var a = var b = 0; 

etc...


1
En savoir plus sur l'affectation multiple: comment fonctionne l'affectation de variable dans JavaScript? . Je trouve ce modèle utile dans une fermeture pour exposer les fonctions du constructeur:var $cls = my.namespace.Foo = function(args){ ... }
blong

Je me demande pourquoi vous voulez le condenser en premier lieu. IMHO déclarer et attribuer un variabler après l'autre est beaucoup plus clair et plus facile à comprendre pour quiconque.
Henning

Réponses:


76

Vous voulez vous fier aux virgules, car si vous vous fiez à la construction d'affectation multiple, vous vous tirerez une balle dans le pied à un moment ou à un autre.

Un exemple serait:

>>> var a = b = c = [];
>>> c.push(1)
[1]
>>> a
[1]

Ils font tous référence au même objet en mémoire, ils ne sont pas "uniques" puisque chaque fois que vous faites une référence à un objet (tableau, objet littéral, fonction), il est passé par référence et non par valeur. Donc, si vous ne modifiez qu'une seule de ces variables et que vous vouliez qu'elles agissent individuellement, vous n'obtiendrez pas ce que vous voulez car ce ne sont pas des objets individuels.

Il y a aussi un inconvénient à l'affectation multiple, en ce que les variables secondaires deviennent globales et que vous ne voulez pas s'infiltrer dans l'espace de noms global.

(function() {  var a = global = 5 })();
alert(window.global) // 5

Il est préférable d'utiliser simplement des virgules et de préférence avec beaucoup d'espaces pour que ce soit lisible:

var a = 5
  , b = 2
  , c = 3
  , d = {}
  , e = [];

2
C'est vraiment un problème avec l'attribution de références de tableau en général, pas seulement avec les instructions d'affectation en tant que valeurs.
Matthew Flaschen

"Donc, alors que vous pouvez vous en tirer avec plusieurs affectations de main droite pour des choses comme des littéraux numériques"
meder omuraliev

1
@meder, c'est un problème avec toutes les affectations. Il n'y a rien de spécial à propos de la main droite.
Matthew Flaschen

Je voulais dire les affectations en général. Texte modifié.
meder omuraliev

2
Quelque chose à garder à l'esprit avec ce modèle d'assignation multiple est que toute assignation non déclarée, en mode strict ES5, provoquera une ReferenceErrorexception ... OMI, elles devraient être évitées ...
CMS

64

En utilisant es6 ou node de Javascript, vous pouvez effectuer les opérations suivantes:

var [a,b,c,d] = [0,1,2,3]

Et si vous souhaitez imprimer facilement plusieurs variables sur une seule ligne, procédez comme suit:

console.log(a, b, c, d)

0 1 2 3

Ceci est similaire à la réponse de @alex gray ici, mais cet exemple est en Javascript au lieu de CoffeeScript.

Notez que cela utilise l' affectation de déstructuration de tableau de Javascript


2
pourquoi ne pas utiliser console.log(a,b,c,d)dans ce cas à la place? il est plus court et donne le même résultat
Josh Broadhurst

44

Il n'y a aucun moyen de le faire en une seule ligne avec l'affectation comme valeur.

var a = b = 0;

rend b global. Une manière correcte (sans fuites de variables) est légèrement plus longue:

var a = 0, b = a;

ce qui est utile dans le cas:

var a = <someLargeExpressionHere>, b = a, c = a, d = a;

1
"Il n'y a aucun moyen d'utiliser l'affectation comme valeur sans répéter 0." - Que voulez-vous dire?
palswim

28

Pourquoi ne pas le faire en deux lignes?

var a, b, c, d;    // All in the same scope
a = b = c = d = 1; // Set value to all.

La raison pour laquelle, est de conserver la portée locale sur les déclarations de variables, comme ceci:

var a = b = c = d = 1;

conduira aux déclarations implicites de b, cet dsur la portée de la fenêtre.


Cela a été utile pour moi car je déclare de nombreuses variables à l'avance dans mon programme. Maintenant, au lieu de prendre plus de 30 lignes, je peux utiliser quelques lignes sans sacrifier la lisibilité.
Kalif Vaughn

11

Voici la nouvelle méthode ES6 de déclaration de plusieurs variables sur une seule ligne:

const person = { name: 'Prince', age: 22, id: 1 };

let {name, age, id} = person;

console.log(name);
console.log(age);
console.log(id);

* Votre nom de variable et votre index d'objet doivent être identiques


2
C'est plus long que la question du PO, car c'est équivalent à let { a, b } = { a: 0, b: 0 }.
Dan Dascalescu


0

notez que vous ne pouvez le faire qu'avec des nombres et des chaînes

vous pourriez faire...

var a, b, c; a = b = c = 0; //but why?

c++;
// c = 1, b = 0, a = 0;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.