Rumah > Soal Jawab > teks badan
Melihat sekeping kod ini hari ini, bercakap tentang salinan cetek
/* ================ 浅拷贝 ================ */
function simpleClone(initalObj) {
var obj = {};
for ( var i in initalObj) {
obj[i] = initalObj[i];
}
return obj;
}
/* ================ 客户端调用 ================ */
var obj = {
a: "hello",
b: {
a: "world",
b: 21
},
c: ["Bob", "Tom", "Jenny"],
d: function() {
alert("hello world");
}
}
var cloneObj = simpleClone(obj); // 对象拷贝
console.log(cloneObj.b); // {a: "world", b: 21}
console.log(cloneObj.c); // ["Bob", "Tom", "Jenny"]
console.log(cloneObj.d); // function() { alert("hello world"); }
// 修改拷贝后的对象
cloneObj.b.a = "changed";
cloneObj.c = [1, 2, 3];
cloneObj.d = function() { alert("changed"); };
console.log(obj.b); // {a: "changed", b: 21} // // 原对象所引用的对象被修改了
console.log(obj.c); // ["Bob", "Tom", "Jenny"] // 原对象所引用的对象未被修改
console.log(obj.d); // function() { alert("hello world"); } // 原对象所引用的函数未被修改
1. Secara logiknya, salinan cetek hanya perlu menyalin rujukan objek, bukan objek itu sendiri Kemudian kedua-dua obj.c dan obj.d harus diubah suai?
2. var cloneObj=obj, adakah ia dianggap salinan cetek?
ringa_lee2017-05-19 10:20:55
var cloneObj=obj // 这才是浅拷贝,改变这里会联动改变
// 这个方法不是浅拷贝,是一级深拷贝,二级拷贝是浅拷贝,因为obj[i] = initalObj[i];就相当于你的var cloneObj=obj 。
function simpleClone(initalObj) {
var obj = {};
for ( var i in initalObj) {
obj[i] = initalObj[i]; ////////注意这里 除非你递归赋值
}
return obj;
}
Jadi
cloneObj.a = "changed"; // obj不变
cloneObj.b.a = "changed"; // obj改变
高洛峰2017-05-19 10:20:55
Pembolehubah yang menyimpan objek boleh difahami secara ringkas sebagai alamat, yang melaluinya elemen kanak-kanak lain boleh diperolehi. 2. Salinan cetek objek merujuk kepada mencipta objek baharu dan menyalin nilai sub-elemennya mengikut turutan. 3. Oleh itu, walaupun objek yang disalin mempunyai nilai sub-elemen yang sama, ia tidak sama apabila dibandingkan kerana alamat tempat ia menyimpan pembolehubah sub-elemen adalah berbeza. 4. Kaedah kedua anda ialah penetapan alamat langsung Tiada pembolehubah baharu dihasilkan, atau tiada alamat baharu untuk mencipta subelemen dijana. Ini tidak dipanggil penyalinan.