我正在尝试创建一个可以与任何字符串重用的函数,将字符串作为第一个参数传递给它,并在将其与运算符连接时,我正在尝试创建一个基本的计算器,并且正在使用几个字符串,这些字符串为运算符显示不同的值(例如,用“ 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”,但是它将返回空字符串。怎么解决?
答案 0 :(得分:1)
这是因为您没有在函数中返回任何内容,也没有将其分配给变量。实际上,str
在concOperator
函数的范围内。
一种解决方法:
let evalString = '';
let displayString = '';
let currentNumber = '5';
function concOperator(str, operator) {
return `${str} ${currentNumber} ${operator} `;
}
evalString = concOperator(evalString, '*');
displayString = concOperator(displayString, 'x');
答案 1 :(得分:0)
JavaScript不会通过引用传递字符串。字符串和其他基元按值传递,这意味着在代码的第一个函数调用中,str是evalString的副本-修改str不会修改evalString。您需要返回串联的值,并将evalString分配给此结果。
(相关且重要的注意事项:Java语言中的对象与基元相反,使用共享调用。这意味着当对象作为函数参数传递时,该参数采用引用。换句话说,重新分配参数变量不会更改原始对象,但是修改参数的属性会影响原始对象。)>
答案 2 :(得分:0)
我还将尝试将字符串附加到数组中,然后将数组连接到字符串中,例如:
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(' '))
我希望这会有所帮助。
答案 3 :(得分:0)
字符串在JavaScript中不可更改,str+=something
是str=str+something
的简写形式,其中右侧创建了一个全新的字符串,然后将其存储在局部变量{{1}中},而无需更改原始字符串(它们仍然可以访问,并且在外部不变)。
如果希望从外面看到结果,可以return
:
str
所以你的功能可能是
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);
)是可变的。