【问题标题】:Make object not pass by reference使对象不通过引用传递
【发布时间】:2011-03-18 02:11:01
【问题描述】:

我刚刚发现了在 Javascript 中通过引用传递对象的困难方式,例如:

for(var layer = 0; layer < hudLayers['layers'].length; layer++){

    // Store the to-be-calculated values in this object
    var tempValues = hudLayers['layers'][layer];

    tempValues['name'] = 'test';
}

这将改变 tempValues 和 hudLayers 中的值。 (看起来有点明显,但没有一点代码的帖子看起来很赤裸裸。)

有没有快速的解决方法?

【问题讨论】:

  • 您想为tempValues 分配一个值,但它没有反映在hudLayers 中吗?你为什么想要那个?
  • 你真的想知道吗? :) hudLayers 包含图像宽度和高度的几个变量。这是一个HUD,所以它必须每秒绘制多次。 hudLayers 中的内容实际上是“蓝图”(此图像的宽度基于该变量的值,...)如果我简单地将其写回 hudLayers,则蓝图消失了,屏幕上的图像将始终保持不变。

标签: javascript object pass-by-reference byref


【解决方案1】:

这不是通过引用传递的示例(您没有传递任何参数)。 但是,您是对的;分配对象不会进行深拷贝。

您可以像这样对对象进行深层复制:

function deepCopy(obj) {
    if (typeof obj !== "object") return obj;
    if (obj.constructor === RegExp) return obj;

    var retVal = new obj.constructor();
    for (var key in obj) {
        if (!obj.hasOwnProperty(key)) continue;
        retVal[key] = deepCopy(obj[key]);
    }
    return retVal;
}

请注意,如果对象的构造函数有任何副作用,此代码将触发它们。

【讨论】:

    【解决方案2】:

    JavaScript 中没有引用传递。对象是通过引用访问的,这些引用是通过值来分配或传递的,就像在 Java 中一样

    【讨论】:

      【解决方案3】:

      制作对象的深层副本就像objCopy = obj.toSource(); 一样简单。

      .toSource on MDN

      【讨论】:

      • 我认为toSource 返回一个字符串表示。可以设置一个测试用例吗?
      猜你喜欢
      • 2017-09-11
      • 1970-01-01
      • 2011-07-06
      • 2012-07-07
      • 2012-01-05
      • 2012-07-16
      • 2011-12-12
      • 2018-01-05
      相关资源
      最近更新 更多