J'essaie de créer une fonction que je peux réutiliser avec n'importe quelle chaîne, en lui passant une chaîne comme premier paramètre et en lui concaténant un opérateur alors que j'essaie de créer une calculatrice de base et que je travaille avec quelques chaînes qui affichent des valeurs différentes pour les opérateurs (par exemple 'x' au lieu de '*').
let evalString = ''; let displayString = ''; let currentNumber = '5'; function concOperator(str, operator) { str += currentNumber + ' ' + operator + ' '; } concOperator(evalString, '*'); concOperator(displayString, 'x'); console.log(evalString); console.log(evalString);
Donc je m'attends à ce que evalString soit "5 *" et displayString soit "5 x" après avoir appelé une fonction, mais à la place renvoie des chaînes vides. Comment pourrait-il être corrigé?
4 Réponses :
C'est parce que vous ne renvoyez rien dans votre fonction et que vous ne l'assignez pas à votre variable. En fait, str
est dans la portée de la fonction concOperator
.
Un moyen de résoudre ce problème:
let evalString = ''; let displayString = ''; let currentNumber = '5'; function concOperator(str, operator) { return `${str} ${currentNumber} ${operator} `; } evalString = concOperator(evalString, '*'); displayString = concOperator(displayString, 'x');
Merci pour une réponse rapide! Cela résout le problème.
Javascript ne passe pas les chaînes par référence. Les chaînes et autres primitives sont passées par valeur, ce qui signifie que dans le premier appel de fonction de votre code, str est une copie de evalString - la modification de str ne modifiera pas evalString. Vous devez renvoyer la valeur concaténée et affecter evalString à ce résultat.
(Note connexe et importante: les objets en Javascript, par opposition aux primitives, utilisent l'appel par partage. Cela signifie que lorsqu'un objet est passé en paramètre de fonction, le paramètre prend une copie de la valeur de référence à l'objet. En d'autres termes, la réaffectation de la variable de paramètre ne changera pas l'objet d'origine, mais la modification des propriétés de du paramètre affectera l'objet d'origine.) p>
Ce que j'essaierais également est d'ajouter les chaînes dans un tableau, puis de joindre le tableau en une chaîne, par exemple:
let evalString = ''; let displayString = ''; let currentNumber = '5'; let test = [] function concOperator(data) { test = [...test, data] } concOperator('5'); concOperator('x'); concOperator('5'); concOperator('*'); console.log(evalString); console.log(evalString); console.log(test.join(' '))
J'espère que cela vous aidera.
p>
Les chaînes ne sont pas modifiables en JavaScript, Donc, votre fonction pourrait être ou simplement et dans les deux cas vous le feriez doivent stocker la chaîne retournée à l'extérieur (vient de se passer avec Alternativement, vous pouvez faire de la magie avec des objets: Parce que les objets (comme str + = something
est une forme courte pour str = str + something
, où le côté droit crée une toute nouvelle chaîne, puis il est stocké dans la variable locale, str
, sans altérer les chaînes d'origine (elles restent accessibles et inchangées à l'extérieur).
Vous pouvez retourner
a> le résultat si vous voulez qu'il soit vu de l'extérieur: function test(a,b){
console.log("before a:",a);
console.log("before b:",b);
a.data+=b;
console.log("after a:",a);
console.log("after b:",b);
}
var x={data:"x"};
var y="y";
test(x,y);
console.log("x has changed:",x);
function concOperator(str, operator) {
return currentNumber + ' ' + operator + ' ';
}
function concOperator(str, operator) {
str += currentNumber + ' ' + operator + ' ';
return str;
}
z
ci-dessus). function test(a,b){
console.log("before a,b:",a,b);
a+=b;
console.log("after a,b:",a,b);
return a;
}
var x="x";
var y="y";
var z=test(x,y);
console.log("x,y,z:",x,y,z);
x
dans ce deuxième extrait de code) sont modifiables.
Merci! La solution avec les objets est un peu déroutante pour moi en ce moment, mais c'est une excellente alternative!
Vous devez «renvoyer» la valeur. Traitez l'opération comme créant une nouvelle valeur de chaîne, plutôt que de modifier la valeur existante, entraînant la perte de la référence.