【问题标题】:jQuery automatically assign values to variablesjQuery 自动为变量赋值
【发布时间】:2013-12-03 22:41:09
【问题描述】:

我在 jQuery 中遇到了自动更改变量值的问题。 像下面的例子。

 graphB = some values;
 var graphOption = graphB;

现在如果我更改“graphOption”的值,那么它会自动更改“graphB”的值。

我不知道是什么问题。

【问题讨论】:

  • 看起来你正在处理一个对象,那么这两个变量都引用同一个对象引用
  • 但如果我改变“graphOption”的值,那么它将如何影响“graphB”
  • 在 javascript 中,对象是按引用复制的,而不是按值复制的。

标签: jquery


【解决方案1】:

两个变量都引用同一个对象,因此对其属性所做的任何更改都会反映在另一个中;您需要先制作graphB 的(浅)副本:

var graphOption = $.extend({}, graphB);

这会创建一个带有来自graphB 的属性副本的新对象。请注意,如果这些复制的属性引用一个对象,它们可能会出现相同的问题。为避免这种情况,您需要一个深拷贝:

var graphOption = $.extend(true, {}, graphB);

另请参阅:jQuery.extend()

【讨论】:

    【解决方案2】:

    问题不在于 jQuery。在 javascript 对象属性中维护引用。换句话说,您不是在分配值,而是在创建指向原始值的指针,如果原始值被更改,指针仍然指向它。

    http://snook.ca/archives/javascript/javascript_pass

    Javascript pointer/reference craziness. Can someone explain this?

    您需要做的是克隆对象,以便获得一个副本,而不仅仅是指向原始对象的指针。

    您可以通过多种方式解决此问题,可以使用 jQuery 的 .extend,可以使用下划线或 lodash 的 .clone,或 angular 的 .copy,或者您可以自己做!

    【讨论】:

      【解决方案3】:

      它们都是对同一个对象的引用。 (您可以将 graphB 和 graphOption 这两个词视为对象的地址,而不是实际对象。它们都指向同一个地方。)要实际复制第一个,您可以使用

         var graphOption = $.extend({},graphB);
      

      进行浅拷贝(任何内部对象仍将使用相同的引用)。

      var graphOption = $.extend(true, {},graphB);
      

      进行深层复制。

      编辑:.clone 适用于选定的 dom 元素,而不是对象。

      【讨论】:

      • 脑子放屁。克隆适用于 dom 元素的选择。投票赞成你的答案。
      猜你喜欢
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多