如何创建一个将任何给定字符串与第二个参数连接起来的函数?

How to create a function that will concatenate any given string with second parameter?


我正在尝试创建一个可以与任何字符串一起重用的函数,将一个字符串作为第一个参数传递并将运算符连接到它,因为我正在尝试创建一个基本计算器并且我正在使用几个为运算符显示不同值的字符串(例如 '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”,但它 returns 为空字符串。如何解决?

这是因为您没有在函数中返回任何内容,也没有将其分配给变量。实际上,strconcOperator函数的范围内。

解决此问题的方法:

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

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

evalString = concOperator(evalString, '*');
displayString = concOperator(displayString, 'x');

Javascript 不通过引用传递字符串。字符串和其他基元按值传递,这意味着在代码的第一个函数调用中,str 是 evalString 的副本——修改 str 不会修改 evalString。您需要 return 连接值并将 evalString 分配给此结果。

(相关重要说明:Javascript 中的对象与基元相反,使用 call-by-sharing。这意味着当对象作为函数参数传递时,该参数采用reference对象的值。换句话说,re-assigning参数变量不会改变原始对象,而是修改属性of参数会影响原对象。)

我还会尝试将字符串追加到一个数组中,然后将数组连接成一个字符串,例如:


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

希望对您有所帮助。

Strings are not mutable in JavaScript,str+=somethingstr=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)是可变的。