[英]Swap two global JS variables inside function
我想在函数内交换两个全局变量值。
到目前为止,这是我尝试过的。 由于技术原因, 我无法在function之外更改值 。 我的脚本包含很多代码行,但是我无法更改var
:
var One = 10
var Two = 20
var Three = 30
function altStats(originaleValue, alternativeValue)
{
// Swap logic goes here...
}
altStats(One, Two);
console.log(One); // should be 20
console.log(Two); // should be 10
console.log(Three); // should be 30
参数始终在JavaScript中按值传递。 您可以传入一个对象并进行交换。
如果这些变量不在window
,则可以用这种方式交换它们。
如果我真的只能像您所说的那样在函数内部编写:
var One = 10 var Two = 20 var Three = 30 function altStats(originaleValue, alternativeValue) { var app=[One,Two,Three], result=[]; app.forEach(function(variable){ if(variable===originaleValue) result.push(alternativeValue); else if(variable===alternativeValue) result.push(originaleValue); else result.push(variable); }); One=result[0]; Two=result[1]; Three=result[2]; } altStats(One, Two); console.log(One); // 20 console.log(Two); // 10 console.log(Three); // 30
一个聪明的技巧是使用[One, Two] = [Two, One]
。 它使用数组在一行中交换值。 试试吧:
var One = 10; var Two = 20; var Three = 30; [One, Two] = [Two, One]; console.log("One: "+One); // 20 console.log("Two: "+Two); // 10 console.log("Three: "+Three); // 30
上面的代码段仅在最新的浏览器中有效,如注释中所建议。 因此,遗留解决方案将是:
var One = 10; var Two = 20; var Three = 30; One = [Two, Two = One][0]; console.log("One: "+One); // 20 console.log("Two: "+Two); // 10 console.log("Three: "+Three); // 30
在这个版本中,我们所做的就是我们使用了两个值的数组,第二个传递的价值One
到Two
,而第一个是原始值Two
。 从该数组中,我们获取1st [0]
元素并设置值One
。 有点令人困惑,但是如果您花一分钟时间,您会明白的。
最后,您可以使用一个函数来执行此操作,该函数将数组作为参数,交换其值并返回该数组。 使用[One, Two]
调用该函数并将值返回到[One, Two]
将实现与上述两种解决方案相同的操作:
var One = 10; var Two = 20; var Three = 30; function altStats(values) { var temp = values[0]; values[0] = values[1]; values[1] = temp; return values; } [One, Two] = altStats([One, Two]); console.log("One: " + One); // 20 console.log("Two: " + Two); // 10 console.log("Three: " + Three); // 30
仅在将变量传递给参数的情况下尝试在函数内进行交换将不起作用。 使用一个对象。 或不要使用函数,因为变量保留在函数范围内。
var One = 10 var Two = 20 var Three = 30 var temp = One; One = Two; Two = temp; console.log(One); // 20 console.log(Two); // 10 console.log(Three); // 30
您可以执行此操作的另一种方法是将对象传递给函数
function swap(obj, original, toSwap) {
var temp = obj[original];
obj[original] = obj[toSwap];
obj[toSwap] = temp;
return obj;
}
var test = {ONE: 10, TWO: 20}
var res = swap(test, 'ONE', 'TWO');
console.log(res); //{ONE: 20, TWO: 10}
只要您要交换的值是数字,就可以使用不需要临时变量的这种方法:
One = One + Two; //One = 30, Two = 20
Two = One - Two; //One = 30, Two = 10
One = One - Two; //One = 20, Two = 10
几乎在任何情况下都不会产生任何相关的变化,但是值得知道这是可能的。
在我撰写本文时,已经有一个可接受的答案,但这是一个hack,并不可靠(请参阅我对答案的评论)。
因此,答案是,您无法做一般性的事情。 由于JS不会通过引用传递参数,而是通过值传递参数,因此您需要自己引入一个引用,以便能够传递它,例如:
var values = { One: 10, Two: 20, Three: 30 } function altStats(values, propX, propY) { var tmp=values[propX]; values[propX]=values[propY]; values[propY]=tmp; } altStats(values, "One", "Two"); console.log(values.One); // 20 console.log(values.Two); // 10 console.log(values.Three); // 30
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.