可以用JavaScript编写一个数字swap()函数吗?
swap()函数将产生比内联工作更干净的代码()。不幸的是,以下函数没有完成任何操作,因为JavaScript中的参数总是按值传递:可以用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
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()
,时空吸血鬼会偷你的信用卡吗?你应该自己决定,但这里有一些帮助:
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修复了它!;)