En regardant ce morceau de code aujourd'hui, je parle de copie superficielle
/* ================ 浅拷贝 ================ */
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. Logiquement parlant, la copie superficielle ne doit copier que la référence de l'objet, pas l'objet lui-même. Ensuite, obj.c et obj.d doivent être modifiés ?
2. var cloneObj=obj, est-ce considéré comme une copie superficielle ?
Alors
La variable stockant l'objet peut être simplement comprise comme une adresse, à travers laquelle d'autres éléments enfants peuvent être obtenus. 2. La copie superficielle d'un objet fait référence à la création d'un nouvel objet et à la copie séquentielle des valeurs de ses sous-éléments. 3. Par conséquent, bien que les objets copiés aient les mêmes valeurs de sous-éléments, ils ne sont pas égaux lorsqu'on les compare car les adresses où ils stockent les variables de sous-éléments sont différentes. 4. Votre deuxième méthode est l'attribution directe d'adresses. Aucune nouvelle variable n'est générée, ni aucune nouvelle adresse pour la création de sous-éléments n'est générée. Cela ne s'appelle pas copie.