重要的是要了解=JavaScript中的运算符做什么和不做什么。
该=运营商不会使拷贝数据。
在=操作创建一个新的参考到相同的数据。
运行原始代码后:
var a = $('#some_hidden_var').val(),
    b = a;
a和b现在是同一对象的两个不同名称。
无论是通过a变量还是通过变量引用该对象,对您对该对象的内容所做的任何更改都将被视为相同b。它们是同一对象。
因此,当您稍后尝试使用以下代码“还原” b到原始a对象时:
b = a;
该代码实际上什么也不做,因为a和b是完全一样的。代码与您编写的代码相同:
b = b;
显然什么也做不了。
为什么您的新代码有效?
b = { key1: a.key1, key2: a.key2 };
在这里,您将使用{...}对象文字创建一个全新的对象。此新对象与旧对象不同。因此,您现在将设置b为对此新对象的引用,该对象将执行您想要的操作。
要处理任何任意对象,可以使用对象克隆功能,例如Armand的答案中列出的对象克隆功能,或者由于使用的是jQuery,因此只需使用该$.extend()功能。此功能将对对象进行浅拷贝或深拷贝。(不要将此与用于复制DOM元素而不是对象的$().clone()方法混淆。)
对于浅表副本:
b = $.extend( {}, a );
或深拷贝:
b = $.extend( true, {}, a );
浅拷贝和深拷贝之间有什么区别?浅表副本类似于使用对象文字创建新对象的代码。它创建一个新的顶级对象,其中包含对与原始对象相同属性的引用。
如果您的对象仅包含数字和字符串之类的原始类型,则深层副本和浅层副本将做完全相同的事情。但是,如果您的对象包含嵌套在其中的其他对象或数组,则浅表副本不会复制这些嵌套的对象,而只会创建对其的引用。因此,嵌套对象可能会遇到与顶级对象相同的问题。例如,给定此对象:
var obj = {
    w: 123,
    x: {
        y: 456,
        z: 789
    }
};
如果您对该对象进行浅表复制,则x新对象的属性x与原始对象是同一对象:
var copy = $.extend( {}, obj );
copy.w = 321;
copy.x.y = 654;
现在,您的对象将如下所示:
// copy looks as expected
var copy = {
    w: 321,
    x: {
        y: 654,
        z: 789
    }
};
// But changing copy.x.y also changed obj.x.y!
var obj = {
    w: 123,  // changing copy.w didn't affect obj.w
    x: {
        y: 654,  // changing copy.x.y also changed obj.x.y
        z: 789
    }
};
您可以通过深层复制来避免这种情况。深层副本递归到每个嵌套对象和数组(以及Armand代码中的Date),以与复制顶级对象相同的方式来复制这些对象。所以改变copy.x.y不会影响obj.x.y。
简短的回答:如果有疑问,您可能想要一份深层的副本。
               
              
a是.val()我假设是JSON(字符串)而不是对象设置的,对吗?您是否JSON.parse(a)有时会用来获取实际物体?