在JavaScript中交换两个对象

7

我有以下代码:

MyObject.prototype.doIt = function()
{
     var a = this.obj1;
     var b = this.obj2; 
}

我该如何交换 this.obj1this.obj2 的值,使得 obj1 成为 obj2,obj2 成为 obj1。

注意:请记住我不是使用原始类型。

5个回答

16

您可以使用简单的恒等函数来交换任意数量、甚至不同类型的对象或文字。

var swap = function (x){return x};
b = swap(a, a=b);
c = swap(a, a=b, b=c);

这在JavaScript中可行,因为即使它们未被声明或使用,它也接受额外的参数。 a=b等赋值操作发生在将a传递到函数之后。


使用以下代码进行交换:const swap = x => x; - Joshua Jarman

5
我们可以使用以下代码对销毁对象进行处理:
let a = 2;
let b = 4;
[a, b] = [b, a];

4

使用一个临时变量来保存其中一个对象的内容,以便进行交换:

var tmp = this.obj1;
this.obj1 = this.obj2;
this.obj2 = tmp;

2

您可以轻松地交换属性:

MyObject.prototype.doIt = function()
{
     var a = this.obj1;
     var b = this.obj2;
     this.obj1 = b;
     this.obj2 = a;
}

obj1obj2不是基本类型并不重要。事实上,您并不需要两个变量:

MyObject.prototype.doIt = function()
{
     var a = this.obj1;
     this.obj1 = this.obj2;
     this.obj2 = a;
}

然而,如果在此代码之外已经存在任何对this.obj1this.obj2的引用,它们将不会被交换。
就交换this.obj1this.obj2(包括现有引用)而言,我认为这是完全不可能的。您可以剥离掉this.obj1的所有属性(将其保存在某个地方),添加this.obj2的属性,然后对this.obj2执行相同的操作。但是,您无法交换原型,因此对象不能从根本上交换身份。

实际上,你可以使用Object.getPrototypeOf()Object.setPrototypeOf()交换原型,但是MDN强烈警告我们这对应用程序性能来说是一个非常糟糕的想法。 - Félix Brunet
@FélixBrunet - 没有想过这一点。我猜可以实现类似于Smalltalk的become:方法的东西。太酷了! - Ted Hopp

0

这里有一个具体对象的例子,假设你的原始对象是2个div,分别为div1和div2。

要交换它们,

var temp1 = div1;
var temp2 = div2;

div1 = temp2;
div2 = temp1;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接