簡體   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