Ich schaue mir heute diesen Code an und spreche von flacher Kopie
/* ================ 浅拷贝 ================ */
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. Logischerweise sollte eine flache Kopie nur die Referenz des Objekts kopieren, nicht das Objekt selbst. Dann sollten sowohl obj.c als auch obj.d geändert werden?
2. var cloneObj=obj, wird es als flache Kopie betrachtet?
所以
存放对象的变量可以简单的理解为一个地址,通过这个地址再去获取其他子元素。2. 对象的浅拷贝指的是新建一个对象,把他的子元素的值依次复制过去。3. 因此拷贝后的对象虽然子元素值相同但是,做比较是不相等的,因为他们存放子元素变量的地址是不同的。4.你的第二种方式是地址的直接赋值,没有产生新的变量,或者说没有产生新的创建子元素的地址,这就不叫拷贝。