2016-05-10 2 views
2
function swap(x,y){ 
    var t=x; 
    x=y; 
    y=t; 
} 

Это не сработает. когда вы swap(a,b), переменные a и b скопированы в функцию, и все, что происходит в этой функции, не влияет на реальное значение a и b. Я хочу что-то вроде этого:Функция javascript для обмена двумя переменными

(function(){ 
a=1; 
b=2; 
function swap(){//something} 
swap(a,b); 
console.log(a) //2 
console.log(b) //1 
})() 

Как это сделать?

+7

В JS скалярные переменные передаются ** по значению **, а не по ссылке. Так .. ты не можешь. – hindmost

+0

Возможный дубликат [Как поменять две переменные в JavaScript] (http://stackoverflow.com/questions/16201656/how-to-swap-two-variables-in-javascript) – Vadzim

ответ

1

Вы не можете. Аргументы: passed by value, даже в случае объектов. Просто переданное им значение является ссылкой на объект.

В основном это означает, что любые полученные вами аргументы не имеют фактического подключения к исходным переменным, которые вы передали, за исключением того, что они могут использовать ссылку.

Представьте, что вы написали a и b на листе бумаги. В JS единственный способ поделиться этими значениями с помощью функции - скопировать их на различные лист бумаги и передать ее функции. Поэтому, даже если эта функция сцарапает a на новом листе бумаги и заменит ее на b, это не изменит того, что вы написали на оригинальной бумаге.

Короче говоря, невозможно изменить значение переменной, которая использовалась в качестве аргумента для функции.

0

вы можете установить переменную вне области видимости функции, так что вы можете использовать его внутри функции, это то, что вы можете сделать:

<head> 
<script>var x=0, y=1;</script> 
</head> 

<script> 
function swap() 
{ 
    var t = x; 
    x = y; 
    y = t; 
} 
</script> 

или даже это работает

<script> 
var x=0; y=1; 
function swap(id1, id2) 
{ 
    var t = x; 
    x = y; 
    y = t; 
} 
console.log(x+" "+y); 
</script> 

I использовал это довольно много и отлично работает. x и y могут быть взяты из любого места и будут работать внутри функции без проблем. вы также можете сделать

function(id1, id2) 
{ 
    x=document.getElementById(id1); 
    y=document.getElementById(id2); 

    var t = x.value; 
    x.value = y.value; 
    y.value = t; 

} 
+0

Единственная проблема с этим - вы можете только замените эти две переменные. Это не позволяет вам менять любые другие переменные. –

+0

Что вам нужно в точности? вы можете установить x и y как что угодно. Вы можете установить скрытые входы со значениями или сохранить данные, необходимые внутри массива, но передать значения функции a и сделать изменения в них невозможными. check my edit – bakz

+0

Я имею в виду, что я хотел бы поменять «x» и «y» на одну точку, затем поменять «w» и «z» на другую точку. Эта функция не позволяет мне это делать. Я могу заменить только эти две переменные вместо двух произвольных переменных. –

8

Если вы используете последнюю версию JavaScript (ES2015), то вы можете использовать новую функцию языка под названием «деструктурирующий». Вам не нужна функция. Это выглядит следующим образом:

let a = 1; 
let b = 2; 

// swap! 
[b, a] = [a, b]; 

Если вы хотите функцию, вы можете сделать это следующим образом:

function swap(a, b) { 
    return [b, a] 
} 

[a, b] = swap(a, b); 

Глядя на этот код, я отчасти предпочитаю функцию, хотя это немного лишнее , Мне нравится, насколько это выразительно. Вы не станете озадачиваться тем, что делает код.

0

Как упоминалось в ответах выше, аргументы передаются только по значению. Если вам действительно нужно добиться свопа, вы можете использовать алгоритм с двумя переменными:

var a = 10, b = 20; 
a = a + b; 
b = a - b; 
a = a - b; 
console.log (a+" "+b); // 20 10