Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以用JavaScript编写一个数字swap()函数吗?_Javascript_Swap - Fatal编程技术网

可以用JavaScript编写一个数字swap()函数吗?

可以用JavaScript编写一个数字swap()函数吗?,javascript,swap,Javascript,Swap,swap()函数将产生比内联工作更干净的代码()。不幸的是,以下函数没有完成任何操作,因为JavaScript中的参数总是按值传递: function swap(a,b) { var temp=a; a=b; b=temp; } 是否有任何方法可以编写一个函数来完成这一尝试,尤其是数值 我对这个问题的答案不满意。 有正确的想法,但不处理一般情况。正如您正确识别的,由于参数是按值传递的,因此您无法编写替换块的函数: var a,b; ... var tmp = a; a = b; b = tmp

swap()函数将产生比内联工作更干净的代码()。不幸的是,以下函数没有完成任何操作,因为JavaScript中的参数总是按值传递:

function swap(a,b) { var temp=a; a=b; b=temp; }
是否有任何方法可以编写一个函数来完成这一尝试,尤其是数值

我对这个问题的答案不满意。

有正确的想法,但不处理一般情况。

正如您正确识别的,由于参数是按值传递的,因此您无法编写替换块的函数:

var a,b;
...
var tmp = a; a = b; b = tmp;
但是,如果两者都是对象的值,则可以执行此操作:

var o = {};
o.a = 3;
o.b = 4;
function swap(obj) { var tmp = obj.a; obj.a = obj.b; obj.b = tmp; }
swap(o);
您还可以概括交换:

function swap(obj, a, b) { var tmp = obj[a]; obj[a] = obj[b]; obj[b] = tmp; }
swap(o,'a','b')
您还可以将其作为原型函数:

Object.prototype.swap = function(a,b) { var tmp = this[a]; this[a] = this[b]; this[b] = tmp; }
o.swap('a','b')

我找到了这种方法,这并不太糟糕(至少就我的目的而言):

您需要引用以下参数:

swap('a','b');
swap('list[index1]','list[index2]');
它似乎也适用于更复杂的参数:

swap('a','b');
swap('list[index1]','list[index2]');
注意:您需要在将要使用的每个作用域中实现swap()函数,因为它必须能够访问命名参数。这违背了“不要重复你自己”的原则,但在某些情况下,复制和粘贴一点类似的样板代码可能是可以接受的,如果这样可以简化算法逻辑


顺便说一下:从swap()返回字符串,并依赖调用方将字符串转发到eval:
eval(swap('a','b'))
。这解决了范围问题,但使交换操作更容易出错,也更不吸引人

小心,该消息人士还警告说,这种方法可能导致严重后果


如果你使用
eval()
,时空吸血鬼会偷你的信用卡吗?你应该自己决定,但这里有一些帮助:

我看到的最大问题是,这可能会相对缓慢(取决于解释器如何管理缓存)。如果它对于您的目的来说太慢,那么就不要使用它。

要使swap(a,b)像在C中一样工作,您需要引用变量。它可以做得比上面的答案1轻。只是

function swap(n, m) {
    var temp = this[n];
    this[n] = this[m];
    this[m] = temp;
  }

此函数中的函数名为window,调用名为swap('a','b')。当然,您可以使用逻辑或算术(对于整数)避免局部变量temp。

使用EMCAScript 6,您可以滥用该功能

var x=1,y=2;
log(`x=${x},y=${y}`);
[x,y]=[y,x];

log(`x=${x},y=${y}`)
您是在谈论函数范围之外的变量吗?@jsmorp:swap()的函数范围之外。?是的。然后你在寻找类似这样的东西:
函数交换(_a,_b){a=_b;b=_a}
?@jsmorph:你的交换函数只有在你想修改名为“a”和“b”的变量时才起作用——这不是我想的。想象一下当我意识到Java也不支持这一点时我的惊讶吧:。我已经被C++宠坏了。或者,没有中间的代码> TMP>代码>函数交换(Obj:{Obj.A+= Obj.b;Obj.B= Obj.AOB.B;Obj.A= Obj.B;} < /Cord> @ ThalisKalfigkopoulos)当然有很多方法可以做,但是问题更多地集中在可行性上,通过坚持OP提出的方法,不同的方法(原型方法、直接函数)更加清晰。是否有某种方法可以将“局部范围”作为对象传递,以使其与任意局部变量一起工作?如果在闭包中定义函数(例如
function foo(){function swap()){var tmp=a;a=b;b=tmp;};var a=3,b=7;swap();/*这里a=7和b=3*/}
但它必须在同一范围内定义,与内联swap@Nirk:我的意思是:
swap(locals,'a','b')
与通用的
swap(obj,a,b)一起使用
,但我还没有找到这样做的方法。@icktoofay:谢谢你指出这一点。我编辑了我的答案来解决这个问题。好吧,现在我真的有点傻了。你可以用
eval(swapfn)将
swap()
导入需要它的函数中;
,您以前将
swapfn
声明为一个全局字符串,其中包含
swap()
的整个函数声明。到目前为止,这个答案不太流行,可能应该在生产代码中避免,但它解决了我的问题(用于图形“实验”)--并回答了问题。在Chromium和Firefox中进行了测试。我在使用我的“导入”技术与
“使用严格”
+1时遇到了问题,事实上eval被认为是邪恶的,这并不意味着答案无效或不好(eval的存在是出于某些原因,如果确实有人希望的话,这可能是一个)。这个网站上的否决票真的很糟糕!这个“this”变量的基础是什么?不是函数,但可能是在ES6中进行交换的最好方法。@nobar修复了它!;)