谁能解释一下这个javascript对象"copy"的行为
Can someone explain me this javascript object "copy" behavior
我有以下代码(我使用jQquery库):
var obj = {};
var objstring = '{"one":"one","two":"two","three":"three"}'
// first console output
console.log(objstring);
var jsonobj = $.parseJSON(objstring);
// second console output
console.log(jsonobj);
obj.key = jsonobj;
obj.key.test = "why does this affect jsonobj? (even in the second console output)";
// third console output
console.log(jsonobj);
我的问题:当我反对的时候。key = jsonobj,并在新的obj.key中更改值。为什么值在jsonobj然后也改变?我该如何避免呢?(我想要一个新的jsonobj的"副本")。
我做了这个测试用例:http://jsfiddle.net/WSgVz/
我想解决这里发生的一小部分,因为其他人已经很好地解决了JavaScript对象引用的更大问题:
// second console output
console.log(jsonobj);
obj.key = jsonobj;
obj.key.test = "why does this affect jsonobj? (even in the second console output)";
这是WebKit文档错误的结果,即console.log
语句在调用console.log
时不输出对象,而是在一段时间后输出。
这是因为对象没有被复制。obj.key
属性将只包含对对象的引用,因此当您将某些内容分配给obj.key.test
时,效果与将其分配给jsonobj.test
相同。
你可以使用jQuery方法extend来创建一个副本:
obj.key = $.extend({}, jsonobj);
这将复制值到新创建的对象({}
)。
因为当你执行obj.key = jsonobj
时,obj.key
中没有一些新的复制对象;它只是对已经存在的jsonobj
的引用。所以对obj.key
的更改也会改变jsonobj
,因为它们实际上是一样的
这是因为没有复制——只有一个对象,它是由各种变量和属性引用的。当您执行obj.key = jsonobj
时,您只是将引用复制到同一个对象。
JavaScript中的所有对象都是通过引用复制的,这意味着:
var x = {};
var y = x;
x.foo = 22; // y.foo also = 22 since y and x are the same object
如果需要obj.key != jsonobj
,则需要克隆对象。通过创建一个新对象:
obj.key = $.parseJSON(objstring);
或使用jQuery克隆现有的:
obj.key = $.extend({}, jsonobj);
相关文章:
- "“;变量未引用正确的对象
- 如何创建js常量对象与"依赖/相对;价值观
- "属性描述必须是对象“”;错误
- 获取"下一个“;对象中的数值
- 得到"TypeError:对象不是函数“”;在forEach循环中使用超级测试/超级代理时
- "键“;jQuery中的对象无法正常工作
- 为什么下面抛出一个“;对象没有't支持属性或方法'importNode'"在IE11中
- "未捕获[对象对象]”;投掷和接球时
- "对象不是函数“;当将Node.js HTTP服务器对象传递给Socket.IO时
- 将对象设置为Backbone.js模型,而不必调用“;set()"在每一处房产上
- 得到"未捕获的类型错误:未定义的不是函数“;当试图从对象调用get()或set()时
- 获得错误“;对象没有方法'jScrollPane'"与AngularJS一起使用时
- "类型错误:'null'不是对象(正在评估“a.nodeType')”;在phanto
- "这个“;对象函数内部的引用
- "对象没有't支持这种性质或方法“;在IE 8中.在调试中执行精细
- "Function.createDelegate"原因;错误:对象没有't支持属性或方法
- 在javascript中,使用requireJS,我如何"要求“;typescript对象
- a href="上的javascript对象对象;javascript:"呼叫
- TypeError:undefined不是一个对象(正在评估'msg.innerHTML="Uploa
- "[对象对象]”;类型为String