var collection = {
"5439": {
"album": "ABBA Gold"
}
};
function updateRecords(id, prop, value) {
collection1 = collection;
document.write("begin "+JSON.stringify(collection)+"");
collection1[id][prop]=value;
document.write(JSON.stringify(collection1)+"");
}
updateRecords(5439, "tracks", "Addicted to Love");
updateRecords(5439, "test", "my test");
为何结果是
begin {"5439":{"album":"ABBA Gold"}}
"5439":{"album":"ABBA Gold","tracks":"Addicted to Love"}}
begin {"5439":{"album":"ABBA Gold","tracks":"Addicted to Love"}}
{"5439":{"album":"ABBA Gold","tracks":"Addicted to Love","test":"my test"}}
不是
begin {"5439":{"album":"ABBA Gold"}}
{"5439":{"album":"ABBA Gold","tracks":"Addicted to Love"}}
begin {"5439":{"album":"ABBA Gold"}}
{"5439":{"album":"ABBA Gold","test":"my test"}}
collection是全局变量,我在函数里面也仅仅是对局部变量collection1赋值,collection1的改变,为何影响到了collection?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
浅拷贝,经常犯的错误。因为原始对象和新对象引用的同一个内存地址,因此改变一个值就会改变另一个的值。
解决办法:
或
或jquery的extend,反正各种解决办法...
js中对象中,通过等于号赋值(collection1 = collection),改变其中一个的值,另一个的值也会改变。
objection1=objection. 这是个引用类型赋值。也实现了是楼上说浅拷贝。
Js语言里面有六种数据类型。基本类型undefined,null,Boolean,String,Number.一种复杂数据类型。
后者在进行赋值拷贝时,赋值的是其引用地址。所有的备份最终访问的还是同一个对象。
这是引用类型,改变一个值会影响另外一个值的~
基本类型和引用类型的数据储存原理的问题;
这种场景下,建议把源数据,储存为基本类型,然后转为JSON对象就可以了;直接有效;
(根据场景,考虑使用什么类型的)
代码如下;
上面的代码中的对象转为字符串是用工具生成的;
顺便安利一下,我写的chrome扩展,这个礼拜刚传到chrome应用市场;搜索: HTML To Javascript