web-dev-qa-db-fra.com

Valeur renvoyée par l'affectation

Pourquoi l'instruction d'affectation régulière (par exemple, x = 5) renvoie-t-elle la valeur attribuée (5 dans ce cas), alors que l'affectation combinée à une déclaration de variable (var x = 5) renvoie undefined?

J'ai obtenu les valeurs de retour en exécutant ces instructions dans la console Javascript du navigateur Chrome:

> var x = 5;
undefined
> y = 5;
5
32
user10165

C'est comme ça que le langage a été conçu. Cela correspond à la plupart des langues.

Avoir une déclaration de variable renvoyant autre chose que undefined n'a pas de sens, car vous ne pouvez jamais utiliser le mot clé var dans un contexte d'expression.

Faire en sorte que l'affectation soit une expression et non une statement est utile lorsque vous souhaitez définir plusieurs variables avec la même valeur en même temps:

x = y = z = 2;

Il peut aussi être utilisé comme ceci:

x = 2*(y = z); // Set y = z, and x = 2*z

Cependant, ce n'est pas le code le plus lisible et il serait probablement préférable de l'écrire comme suit:

y = z;
x = 2*z;
27
Paulpro

C'est parce que var x = 5; est une déclaration de variable, pas une expression.

Le comportement de cette instruction est décrit dans Section 12.2 du manuel Référence du langage ECMAScript .

  1. Évaluer VariableDeclarationList.
  2. Retour (normal, vide, vide).

Il s’agit d’une valeur de retour void.

6
Ja͢ck

L'opérateur d'affectation (le signe égal) (1) affecte l'opérande du côté droit (c'est-à-dire une valeur ou la valeur d'une variable, d'une propriété ou d'une fonction) à l'opérande du côté gauche (c'est-à-dire une variable ou une propriété). ) et ensuite (2) l'expression d'affectation (par exemple, y = 10) devient un opérande simple avec la même valeur que son opérande de droite (par exemple, 10) avant que le reste de l'expression ne soit évalué. Ceci est similaire à quand une fonction appelée est remplacée par sa valeur de retour lorsqu'une expression est évaluée (bien que les appels de fonction soient en premier dans l'ordre des opérations et que les opérations d'affectation soient quatorzième):

var x, y, z = 1;
x = z + (y = 2); // x === 3     

function returnTwo () {
    return 2;
}

x = z + returnTwo(); // x === 3

Notez que non seulement x est maintenant égal à 3, mais que l'expression entière est évaluée à 3.

Le mot clé var a pour objet de lier les variables à la portée actuelle. Les variables déclarées avec le mot clé var sont liées à la portée dans laquelle elles sont déclarées. Le mot clé var affecte la variable (ou propriété) la plus à gauche en tant que référence à la valeur de l'expression évaluée:

var fun = function () {
    var x = 1;
    var y = x + 1; 
    return y;
}

// The x and y variables are bound to the scope of the fun function.

L'utilisation du mot clé var avec une expression s'appelle une déclaration. Les déclarations sont des actions qui n'évaluent pas une valeur, pas même indéfinie (même si votre console imprime non définie). De plus, les déclarations ne peuvent pas apparaître là où JavaScript attend une expression, comme l'ont montré d'autres réponses à ce message.

3
orb

Lorsque vous écrivez var x = 5;, il déclare xet initialise sa valeur à 5. 

Ceci est un VariableStatementname__, il ne retourne rien,

mais x=5 est un expressionqui attribue 5 à x. en l'absence de xname__, JavaScript crée implicitement un global xen code normal 

1
Sachin

J'ai édité ma réponse à cause de commentaires et d'autres réponses.

L'opérateur d'affectation ne renvoie rien ... Dans l'exemple ci-dessous, l'analyseur JS commence par attribuer 5 à y. La deuxième chose est d’affecter y à x, et ainsi de suite. L'affectation n'est pas return (ce n'est pas une fonction et, dans JS, la syntaxe C++ ne permet pas de surcharger le comportement de l'opérateur). return est plus complexe que l'affectation. La construction return ne renvoie pas seulement une valeur, mais ferme le contexte actuel, ce qui entraîne sa destruction. En outre, il ferme tout contexte parent (modèle de fermeture) si aucun autre enfant ne l'utilise. Alors s'il vous plaît, NE PAS me dire (dans les commentaires) que l'opérateur d'affectation renvoie une valeur. L'opérateur d'assignation dans le cas de JS n'est qu'une construction de langage.

Cette construction de langage est utile dans les chaînes (et c'est pourquoi tout le monde parle de revenir):

a = x = y = 5;

Toute variable non déclarée est déclarée automatiquement par l’analyseur dans la portée globale. Si vous déclarez une variable explicitement, vous ne pourrez pas l'utiliser simultanément dans une chaîne, comme ceci:

a = var x = y = 5;

Une utilisation correcte du code ci-dessus serait:

var x = y = 5;
a = x;

Bien sûr, vous pouvez utiliser des crochets pour clarifier votre code, mais cela ne signifie pas que le code se comporte comme une fonction.

De plus, votre exemple ne fonctionne que dans la console JS, qui ne renvoie pas mais affiche le résultat d'une instruction ou d'une expression. Cela signifie que la console JS traite le résultat de la déclaration de variable comme étant undefined (identique lors de la création de la fonction: function a() {}).

0
Karol