web-dev-qa-db-fra.com

La définition de plusieurs variables sur 1 ligne est-elle valide en javascript? (var x = y = 'valeur';)

Ceci est valable en php:

$x=$y='value';

Cela va forcément définir $ x et $ y sur 'value'.

Est-ce valide en javascript?

var x=y='value';

Je l'ai testé en console chrome et cela a fonctionné comme prévu, mais je voulais juste vérifier avant de commencer à l'utiliser.

30
anonymous-one

Cela ne fonctionne que si le var y qui avait été précédemment défini _, sinon y sera global_.

Dans ce cas, vous feriez mieux de faire:

var x, y;
x = y = 'value';

Chaînage des affectations

Un autre antipattern qui crée des globales implicites consiste à enchaîner les assignations dans le cadre d'une déclaration Var. Dans l'extrait suivant, a est local mais b devient global, ce qui n'est probablement pas ce que vous vouliez faire:

// antipattern, do not use
function foo() {
   var a = b = 0;
   // ...
}

Si vous vous demandez pourquoi cela se produit, c’est à cause de l’évaluation de droite à gauche. Premièrement, L'expression b = 0 est évaluée et dans ce cas, b n'est pas déclaré. La valeur de retour de Cette expression est 0 et elle est affectée à la nouvelle variable locale déclarée avec var a. En d’autres termes, c’est comme si vous aviez tapé:

var a = (b = 0);

Si vous avez déjà déclaré les variables, l’enchaînement des assignations convient et ne crée pas globales inattendues. Exemple:

function foo() {
   var a, b;
   // ...
   a = b = 0; // both local
}

“JavaScript Patterns, de Stoyan Stefanov (O’Reilly). Copyright 2010 Yahoo !, Inc., 9780596806750. ”

65
user278064

Pour éviter que y ne devienne une variable globale, utilisez ce qui suit:

var x, y = x = 'value';

Apparemment, les déclarations sont simplement évaluées de gauche à droite.

6
Dykam

Je suis à peu près sûr que la forme la plus lisible est celle qui n'a pas encore été évoquée: 

let x = 0, y = 0
2
Steven Lu

Oui, c'est valide en Javascript.

Cependant, après avoir recherché le problème sur Google, cette question relative au débordement de pile explique certaines mises en garde, utilisez-la avec prudence.

1
tonycoupland

Lorsque vars ont des valeurs différentes, vous pouvez facilement écrire:

var x = 0,
    y = 1,
    ...
    z = 2;
0
maguri