【问题标题】:Swap two objects in JavaScript在 JavaScript 中交换两个对象
【发布时间】:2013-04-22 16:09:57
【问题描述】:

我有以下代码:

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

如何交换 this.obj1this.obj2 的值,使 obj1 变为 obj2,而 obj2 变为 obj1。

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

【问题讨论】:

    标签: javascript swap


    【解决方案1】:

    您可以使用如下简单的标识函数交换任意数量的对象或文字,甚至是不同类型的:

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

    这在 JavaScript 中有效,因为它接受额外的参数,即使它们没有声明或使用。 a=b 等赋值发生在 a 被传递到函数之后。

    【讨论】:

      【解决方案2】:

      在交换时使用临时变量来保存其中一个对象的内容:

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

      【讨论】:

        【解决方案3】:

        我们可以使用关于破坏对象,如下代码:

        let a = 2;
        let b = 4;
        [a, b] = [b, a];
        

        【讨论】:

          【解决方案4】:

          你可以很容易地交换属性:

          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élixBrunet - 没想到。我想有可能实现类似Smalltalk's become: method 的东西。酷!
          【解决方案5】:

          这是一个具体对象的示例,假设您的原始对象是 2 个 div,div1 和 div2。

          要交换它们,

          var temp1 = div1;
          var temp2 = div2;

          div1 = temp2;
          div2 = temp1;

          【讨论】:

            猜你喜欢
            • 2019-02-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-07-24
            相关资源
            最近更新 更多