繁体   English   中英

在函数内交换两个全局JS变量

[英]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 

ECMAScript 6解决方案

一个聪明的技巧是使用[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 

在这个版本中,我们所做的就是我们使用了两个值的数组,第二个传递的价值OneTwo ,而第一个是原始值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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM