javascript - Masalah dengan salinan cetek dalam js.
世界只因有你
世界只因有你 2017-05-19 10:18:55
0
2
486

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?

世界只因有你
世界只因有你

membalas semua(2)
左手右手慢动作
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改变
小葫芦
  1. 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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan