1. 程式人生 > >Javascript深淺拷貝

Javascript深淺拷貝

區別 備份 而是 包含 空間 對象 想要 spa pan

Javascript有六種基本數據類型(也就是簡單數據類型),它們分別是:Undefined,Null,Boolean,Symbol,Number和String。還含有一種復雜數據類型,就是對象

註意Undefined和Null的區別,Undefined類型只有一個值,就是undefined,Null類型也只有一個值,也就是null
Undefined其實就是已聲明未賦值的變量輸出的結果
null其實就是一個不存在的對象的結果

        var a;
        console.log(a)//undefined

        console.log(document.getElementById(‘liu‘))//沒有id為liu的節點,輸出null

簡單的數據類型和復雜的數據類型有以下重要的區別

對於簡單數據類型

它們值在占據了內存中固定大小的空間,並被保存在棧內存中。當一個變量向另一個變量復制基本類型的值,會創建這個值的一個副本,還有就是不能給基本數據類型的值添加屬性

        var a = 1;
        var b = a;
        a.attr = ‘liu‘;
        console.log(a.attr)//undefined

上面代碼中a就是簡單數據類型(Number),b就是a的副本,它們兩者都占有不同位置但相等的內存空間

對於復雜的數據類型

復雜的數據類型即引用類型,它的值是對象,保存在堆內存中,包含引用類型值的變量實際上包含的並不是對象本身,而是一個指向該對象的指針。從一個變量向另一個變量復制引用類型的值,復制的其實是指針,因此兩個變量最終都指向同一個對象。

        var obj = {
            name:‘liu‘,
            age:0
        }
        var obj2 = obj;
        obj2[‘c‘] = 5;
        console.log(obj);//Object {name: "liu", age: 0, c: 5}
        console.log(obj2);////Object {name: "liu", age: 0, c: 5}

我們可以看到obj賦值給obj2後,當我們更改其中一個對象的屬性值,兩個對象都發生了改變,究其原因局勢因為obj和obj2這兩個變量都指向同一個指針,賦值只是復制了指針,所以當我們改變其中一個的值就會影響另外一個變量的值

淺拷貝

其實這段代碼就是淺拷貝,有時候我們只是想備份數組,但是只是簡單讓它賦給一個變量,改變其中一個,另外一個就緊跟著改變,但很多時候這不是我們想要的

        var obj = {
            name:‘liu‘,
            age:0
        }
        var obj2 = obj;
        obj2[‘c‘] = 5;
        console.log(obj);//Object {name: "liu", age: 0, c: 5}
        console.log(obj2);////Object {name: "liu", age: 0, c: 5}

深拷貝

數組
對於數組我們可以使用slice()concat()方法來解決上面的問題
slice

        var arr = [‘html‘, ‘css‘, ‘js‘];
        var arrCopy = arr.slice(0);
        arrCopy[0] = ‘psconsole.log(arr)//[‘html‘, ‘css‘, ‘js‘]
        console.log(arrCopy)//[‘ps‘, ‘css‘, ‘js‘]

concat

        var arr = [‘html‘, ‘css‘, ‘js‘];
        var arrCopy = arr.concat();
        arrCopy[0] = ‘psconsole.log(arr)//[‘html‘, ‘css‘, ‘js‘]
        console.log(arrCopy)//[‘ps‘, ‘css‘, ‘js‘]

對象
對象我們可以定義一個新的對象並遍歷新的屬性上去實現深拷貝

        var obj = {
            name:‘liu‘,
            age:0
        }

        var obj2 = new Object();
        obj2.name = obj.name;
        obj2.age = obj.age

        obj.name = ‘hua‘;
        console.log(obj);//Object {name: "hua", age: 0}
        console.log(obj2);//Object {name: "liu", age: 0}

Javascript深淺拷貝