1
votes

Comment créer une fonction qui concaténera une chaîne donnée avec un deuxième paramètre?


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é?


1 commentaires

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.


4 Réponses :


0
votes

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');


1 commentaires

Merci pour une réponse rapide! Cela résout le problème.



0
votes

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.)


0 commentaires

0
votes

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>


0 commentaires