1. 程式人生 > 其它 >深拷貝,淺拷貝,深拷貝,淺拷貝,型別校驗,遞迴深拷貝

深拷貝,淺拷貝,深拷貝,淺拷貝,型別校驗,遞迴深拷貝

深拷貝,淺拷貝

深拷貝

概念:深拷貝複製變數值,對於非基本型別的變數,則遞迴至基本型別變數後,再複製。 深拷貝後的物件與原來的物件是完全隔離的,互不影響, 對一個物件的修改並不會影響另一個物件。
如何實現
可以使用:
1.object.assign()
2.擴充套件運算子:…
3.Array.prototype.slice()
4.Array.prototype.concat()
5.JSON.stringify()來轉換,JSON.parse()來解析

淺拷貝

概念:淺拷貝是會將物件的每個屬性進行依次複製,但是當物件的屬性值是引用型別時,實質複製的是其引用,當引用指向的值改變時也會跟著變化。

如何實現
可以使用:直接賦值就好了

原型,原型鏈

原型
每個函式都有prototype(原型)屬性,這個屬性是一個指標,指向一個物件,這個物件的用途是包含特定型別的所有例項共享的屬性和方法,即這個原型物件是用來給例項共享屬性和方法的。
而每個例項內部都有一個指向原型物件的指標。

原型鏈
當一個物件呼叫自身不存在的屬性/方法時,就會去自己 [proto] 關聯的前輩 prototype 物件上去找,如果沒找到,就會去該 prototype 原型 [proto] 關聯的前輩 prototype 去找。依次類推,直到找到屬性/方法或 undefined 為止。從而形成了所謂的“原型鏈”。

型別校驗

基本資料型別

number,string,boolean,null、undefined sy bol

引用資料型別**(物件型別)**

Object、array、function等

1、typeof(函式,返回基本資料型別) 對於基本資料型別判斷是沒有問題的,但是遇到引用資料型別(如:Array)是不起作用的
2、instanceof 判斷new關鍵字建立的引用資料型別
用法: //log(資料 instanceof {array或者object})
不考慮null和undefined以物件字面量建立的基本資料型別
3、constructor constructor似乎完全可以應對基本資料型別和引用資料型別但如果聲明瞭一個建構函式,並且把他的原型指向了Array的原型,這種情況下,constructor也顯得力不從心

4、object.prototype.toString.call() 屬於完美解決方案

遞迴深拷貝

例子

let arr = [1, 2, 3, 4, { name: 123 }]

        Object.prototype.deepClone = function (data) {
            if (typeof (data) == "object") {
                let deepData = data instanceof Array ? [] : {}

                for (let key in data) {
                    // console.log(data[key]);
                    deepClone[key]=typeof(data[key])=="object"?deepClone(data[key]):data[key]
                }
                return deepData
            }else{
                return data
            }
        }

        let newArr = deepClone(arr)
        newArr[4].name="張飛"
        console.log(arr,newArr)