javascript - js裡關於淺拷貝的問題。
世界只因有你
世界只因有你 2017-05-19 10:18:55
0
2
469

今天看著這麼一段 程式碼 講淺拷貝

/* ================ 浅拷贝 ================ */
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、照道理講 淺拷貝 不是應該僅僅複製物件的引用,而不是物件本身,那麼 obj.c和obj.d都應該被修改了呀?

2、var cloneObj=obj ,算不算淺拷貝,怎麼理解?

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

全部回覆(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;
}

所以

cloneObj.a = "changed"; // obj不变
cloneObj.b.a = "changed"; // obj改变
小葫芦
  1. 存放物件的變數可以簡單的理解為一個位址,透過這個位址再去獲取其他子元素。 2. 對象的淺拷貝指的是新建一個對象,把他的子元素的值依序複製過去。 3. 因此拷貝後的物件雖然子元素值相同但是,做比較是不相等的,因為他們存放子元素變數的位址是不同的。 4.你的第二種方式是地址的直接賦值,沒有產生新的變量,或者說沒有產生新的創建子元素的地址,這就不叫拷貝。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!