Как создать функцию, которая объединит любую строку со вторым параметром? - PullRequest
2 голосов
/ 23 мая 2019


Я пытаюсь создать функцию, которую я могу использовать с любой строкой, передавая строку в качестве первого параметра и объединяя в нее оператор, когда я пытаюсь создать базовый калькулятор, и я работаю с парой строккоторые отображают различные значения для операторов (например, «x» вместо «*»).

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

Так что я ожидаю, что evalString будет «5 *», а displayString будет «5 x» после вызова функции, но вместо этого он возвращает пустые строки.Как это можно исправить?

Ответы [ 4 ]

1 голос
/ 23 мая 2019

Это потому, что вы ничего не возвращаете в своей функции и не присваиваете ее своей переменной.На самом деле, str входит в объем функции concOperator.

Способ исправить это:

let evalString = '';
let displayString = '';
let currentNumber = '5';

function concOperator(str, operator) {
    return `${str} ${currentNumber} ${operator} `;
}

evalString = concOperator(evalString, '*');
displayString = concOperator(displayString, 'x');
0 голосов
/ 23 мая 2019

Строки не являются изменяемыми в JavaScript, str+=something - это краткая форма для str=str+something, где правая сторона создает новую строку, а затем она сохраняется в локальной переменной str без изменения оригинала. строки (они остаются доступными и неизменными снаружи).
Вы можете return результат, если вы хотите, чтобы он был виден снаружи:

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

Таким образом, ваша функция может быть

function concOperator(str, operator) {
  str += currentNumber + ' ' + operator + ' ';
  return str;
}

или просто

function concOperator(str, operator) {
  return currentNumber + ' ' + operator + ' ';
}

и в обоих случаях вам придется хранить возвращаемую строку снаружи (только что с z выше).

В качестве альтернативы вы можете творить магию с объектами:

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

Поскольку объекты (например, x во втором фрагменте) являются изменяемыми.

0 голосов
/ 23 мая 2019

Я бы также попытался добавить строки в массив, а затем объединить массив в строку, например:


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

Надеюсь, это поможет.

0 голосов
/ 23 мая 2019

Javascript не передает строки по ссылке. Строки и другие примитивы передаются по значению, что означает, что в первом вызове функции вашего кода str является копией evalString - изменение str не изменит evalString. Вам необходимо вернуть объединенное значение и присвоить evalString этому результату.

(Связанное и важное примечание: объекты в Javascript, в отличие от примитивов, используют call-by-shared. Это означает, что когда объект передается в качестве параметра функции, параметр принимает копию значения ссылка на объект. Другими словами, переназначение переменной параметра не приведет к изменению исходного объекта, но изменение свойств из параметра повлияет на исходный объект.)

...