Comment passer des variables par référence en JavaScript? J'ai 3 variables sur lesquelles je veux effectuer plusieurs opérations, donc je veux les mettre dans une boucle for et effectuer les opérations sur chacune.
pseudo code:
myArray = new Array(var1, var2, var3);
for (var x = 0; x < myArray.length; x++){
//do stuff to the array
makePretty(myArray[x]);
}
//now do stuff to the updated vars
Quelle est la meilleure façon de procéder?
makePretty(var1); makePretty(var2); makePretty(var3); ...
arr = [var1, var2, var3]; for (var i = 0, len = arr.length; i < len; i++) { arr[i] = makePretty(arr[i]); }
- il vous suffit de stocker la valeur renvoyée parmakePretty
back dans l'emplacement du tableau.Réponses:
Il n'y a pas de "passe par référence" disponible en JavaScript. Vous pouvez passer un objet (c'est-à-dire que vous pouvez passer par valeur une référence à un objet) puis demander à une fonction de modifier le contenu de l'objet:
Vous pouvez parcourir les propriétés d'un tableau avec un index numérique et modifier chaque cellule du tableau, si vous le souhaitez.
Il est important de noter que «passe-par-référence» est un terme très spécifique. Cela ne signifie pas simplement qu'il est possible de passer une référence à un objet modifiable. Au lieu de cela, cela signifie qu'il est possible de passer une simple variable de manière à permettre à une fonction de modifier cette valeur dans le contexte d' appel . Alors:
Dans un langage comme C ++, il est possible de le faire parce que cette langue fait (tri-de) ont passe par référence.
edit - cela a récemment (mars 2015) explosé sur Reddit à nouveau sur un blog similaire au mien mentionné ci-dessous, bien que dans ce cas sur Java. Il m'est venu à l'esprit en lisant les allers-retours dans les commentaires de Reddit qu'une grande partie de la confusion provient de la collision malheureuse impliquant le mot "référence". La terminologie «passe par référence» et «passe par valeur» est antérieure au concept de l'utilisation des «objets» dans les langages de programmation. Il ne s'agit vraiment pas d'objets du tout; il s'agit des paramètres de fonction, et plus précisément de la façon dont les paramètres de fonction sont «connectés» (ou non) à l'environnement appelant. En particulier, notez que dans un véritable langage passe-par-référence - celui qui le fait , et il ressemblerait à peu près exactement à ce qu'il fait en JavaScript. en mesure de modifier la référence d'objet dans l'environnement appelant, et c'est l'élément clé que vous ne pouvez pas faire en JavaScript. Un langage passant par référence passerait non pas la référence elle-même, mais une référence à la référence .
modifier - voici un article de blog sur le sujet. (Notez le commentaire de ce post qui explique que C ++ n'a pas vraiment de passe-par-référence. C'est vrai. Ce que C ++ a, cependant, est la possibilité de créer des références à des variables simples, soit explicitement au point de fonction invocation pour créer un pointeur, ou implicitement lors de l'appel de fonctions dont la signature de type argument demande que cela soit fait. Ce sont les éléments clés que JavaScript ne prend pas en charge.)
la source
Les tableaux et les objets sont transmis par référence ou par valeur en fonction de ces conditions:
si vous définissez la valeur d'un objet ou d'un tableau, c'est Pass by Value.
object1 = {prop: "car"}; array1 = [1,2,3];
si vous modifiez la valeur d'une propriété d'un objet ou d'un tableau, il s'agit de Passer par référence.
object1.prop = "car"; array1[0] = 9;
Code
la source
Solution de contournement pour passer une variable comme par référence:
ÉDITER
yup, en fait, vous pouvez le faire sans accès global
la source
Objet simple
Objet personnalisé
Objet
rvar
Déclaration variable
Ou:
Code de test
Résultat de la console de test
la source
Encore une autre approche pour passer toutes les variables (locales, primitives) par référence est d'envelopper la variable avec une fermeture "à la volée"
eval
. Cela fonctionne également avec "use strict". (Remarque: sachez que ceeval
n'est pas convivial pour les optimiseurs JS, également les guillemets manquants autour du nom de la variable peuvent entraîner des résultats imprévisibles)Échantillon en direct https://jsfiddle.net/t3k4403w/
la source
Il y a en fait une jolie sollution:
la source
Personnellement, je n'aime pas la fonctionnalité «passer par référence» offerte par divers langages de programmation. C'est peut-être parce que je découvre juste les concepts de la programmation fonctionnelle, mais j'ai toujours la chair de poule quand je vois des fonctions qui provoquent des effets secondaires (comme la manipulation de paramètres passés par référence). Personnellement, j'adhère fermement au principe de la "responsabilité unique".
À mon humble avis, une fonction doit retourner un seul résultat / valeur en utilisant le mot-clé return. Au lieu de modifier un paramètre / argument, je retournerais simplement la valeur du paramètre / argument modifié et laisserais toutes les réaffectations souhaitées au code appelant.
Mais parfois (espérons-le très rarement), il est nécessaire de renvoyer deux ou plusieurs valeurs de résultat de la même fonction. Dans ce cas, je choisirais d'inclure toutes ces valeurs résultantes dans une seule structure ou un seul objet. Encore une fois, le traitement de toute réaffectation devrait être à la hauteur du code appelant.
Exemple:
Supposons que le passage de paramètres soit pris en charge en utilisant un mot clé spécial tel que «ref» dans la liste des arguments. Mon code pourrait ressembler à ceci:
Au lieu de cela, je préférerais réellement faire quelque chose comme ceci:
Lorsque j'aurais besoin d'écrire une fonction qui renvoie plusieurs valeurs, je n'utiliserais pas non plus les paramètres passés par référence. J'éviterais donc un code comme celui-ci:
Au lieu de cela, je préférerais en fait retourner les deux nouvelles valeurs à l'intérieur d'un objet, comme ceci:
Ces exemples de code sont assez simplifiés, mais ils montrent à peu près comment je gérerais personnellement ce genre de choses. Cela m'aide à garder diverses responsabilités au bon endroit.
Codage heureux. :)
la source
findStuff
simplement renvoyer le tableau résultant. Vous avez trop de déclarer unefoundArray
variable donc j'assigner directement le tableau résultant à elle:var foundArray = findStuff(inArray); if (foundArray.length > 0) { /* process foundArray */ }
. Cela 1) rendrait le code appelant plus lisible / compréhensible, et 2) simplifierait considérablement la fonctionnalité interne (et donc également la testabilité) de lafindStuff
méthode, la rendant en réalité beaucoup plus flexible dans différents (ré) cas d'utilisation / scénarios.J'ai joué avec la syntaxe pour faire ce genre de choses, mais cela nécessite des aides qui sont un peu inhabituelles. Cela commence par ne pas utiliser du tout 'var', mais un simple assistant 'DECLARE' qui crée une variable locale et définit une portée pour celle-ci via un rappel anonyme. En contrôlant la façon dont les variables sont déclarées, nous pouvons choisir de les encapsuler dans des objets afin qu'elles puissent toujours être transmises par référence, essentiellement. Ceci est similaire à l'une des réponses d'Eduardo Cuomo ci-dessus, mais la solution ci-dessous ne nécessite pas d'utiliser des chaînes comme identificateurs de variables. Voici un code minimal pour montrer le concept.
la source
en fait c'est vraiment facile,
le problème est de comprendre qu'une fois les arguments classiques passés, vous êtes limité à une autre zone en lecture seule.
solutions est de passer les arguments en utilisant la conception orientée objet de JavaScript,
c'est la même chose que de mettre les arguments dans une variable globale / portée, mais mieux ...
vous pouvez également promettre des trucs pour profiter de la chaîne bien connue: voici le tout, avec une structure de type promesse
ou mieux encore ..
action.setArg(["empty-array"],"some string",0x100,"last argument").call()
la source
this.arg
ne fonctionne qu'avec l'action
instance. Cela ne fonctionne pas.Javascript peut modifier les éléments du tableau à l'intérieur d'une fonction (il est transmis comme référence à l'objet / tableau).
Voici un autre exemple:
la source
JS n'étant pas de type fort, il vous permet de résoudre les problèmes de différentes manières, comme cela semble dans cette bande de roulement.
Cependant, pour le point de vue de la maintenabilité, je devrais être d'accord avec Bart Hofland. La fonction doit obtenir des arguments pour faire quelque chose et retourner le résultat. Les rendant facilement réutilisables.
Si vous pensez que les variables doivent être transmises par référence, vous pourriez être mieux servi en les construisant en objets à mon humble avis.
la source
Mis à part la discussion passe-par-référence, ceux qui recherchent toujours une solution à la question posée pourraient utiliser:
la source
Je sais exactement ce que vous voulez dire. La même chose dans Swift ne posera aucun problème. L'essentiel est de
let
ne pas l' utiliservar
.Le fait que les primitives soient passées par valeur mais le fait que la valeur de
var i
au point d'itération ne soit pas copiée dans la fonction anonyme est pour le moins surprenant.la source