首先,要想實(shí)現(xiàn)數(shù)據(jù)的深拷貝就要明白什么是深拷貝。
????????深拷貝是指源對(duì)象與拷貝對(duì)象互相獨(dú)立,其中任何一個(gè)對(duì)象的改動(dòng)都不會(huì)對(duì)另外一個(gè)對(duì)象造成影響。
其次,實(shí)現(xiàn)深拷貝就要區(qū)分?jǐn)?shù)據(jù)類(lèi)型,因?yàn)閷?duì)于對(duì)象來(lái)說(shuō),只是簡(jiǎn)單的賦值,共用的還是同一塊內(nèi)存,改變?nèi)魏我粋€(gè)變量都會(huì)影響公用內(nèi)存中的數(shù)據(jù)。

1.所以就要判斷數(shù)據(jù)的類(lèi)型,數(shù)據(jù)類(lèi)型分為基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型:
基本類(lèi)型:String、Number、Boolean、Null、Undefined
引用類(lèi)型:Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle。
2.js有幾種判斷數(shù)據(jù)類(lèi)型的方法,分別有type of,instanceof,constructor,Object.prototype.toString();
具體使用方法如下:
一、typeof,typeof有兩種判斷的方法 typeof A,typeof(A);
typeof 返回一個(gè)表示數(shù)據(jù)類(lèi)型的字符串,返回結(jié)果包括:number、boolean、string、undefined、function、object等6種數(shù)據(jù)類(lèi)型。
typeof 可以對(duì)JS基本數(shù)據(jù)類(lèi)型做出準(zhǔn)確的判斷(除了null,typeof? null會(huì)返回object,因?yàn)樘厥庵祅ull被認(rèn)為是一個(gè)空的對(duì)象引用),而對(duì)于引用類(lèi)型返回的基本上都是object, 當(dāng)我們需要知道某個(gè)對(duì)象的具體類(lèi)型時(shí),typeof 就不能準(zhǔn)確判斷了。

二、instanceof
判斷對(duì)象和構(gòu)造函數(shù)在原型鏈上是否有關(guān)系,如果有關(guān)系,返回真,否則返回假

基本數(shù)據(jù)類(lèi)型沒(méi)有檢測(cè)出他們的類(lèi)型,但是我們使用下面的方式創(chuàng)建num、str、boolean,是可以檢測(cè)出類(lèi)型的:

三、constructor:查看對(duì)象對(duì)應(yīng)的構(gòu)造函數(shù)
constructor 在其對(duì)應(yīng)對(duì)象的原型下面,是自動(dòng)生成的。當(dāng)我們寫(xiě)一個(gè)構(gòu)造函數(shù)的時(shí)候,程序會(huì)自動(dòng)添加:構(gòu)造函數(shù)名.prototype.constructor = 構(gòu)造函數(shù)名

從上面可以看到,undefined和null是不能夠判斷出類(lèi)型的,并且會(huì)報(bào)錯(cuò)。因?yàn)閚ull和undefined是無(wú)效的對(duì)象,因此是不會(huì)有constructor存在的
同時(shí)我們也需要注意到的是:使用constructor是不保險(xiǎn)的,因?yàn)閏onstructor屬性是可以被修改的,會(huì)導(dǎo)致檢測(cè)出的結(jié)果不正確。
四、Object.prototype.toString:不管是什么類(lèi)型,可以立即判斷出
toString是Object原型對(duì)象上的一個(gè)方法,該方法默認(rèn)返回其調(diào)用者的具體類(lèi)型,更嚴(yán)格的講,是 toString運(yùn)行時(shí)this指向的對(duì)象類(lèi)型, 返回的類(lèi)型
格式為[object xxx],xxx是具體的數(shù)據(jù)類(lèi)型,其中包括:
String,Number,Boolean,Undefined,Null,Function,Date,Array,RegExp,Error,HTMLDocument,... 基本上所有對(duì)象的類(lèi)型都可以通過(guò)這個(gè)方法獲取到。

從這個(gè)結(jié)果也可以看出,不管是什么類(lèi)型的,Object.prototype.toString.call();都可以判斷出其具體的類(lèi)型。
下面是對(duì)toString的封裝:

五、綜上,四種方法的優(yōu)缺點(diǎn)如下

從上表中我們看到了,instanceof和constructor不能跨iframe,上面沒(méi)有細(xì)說(shuō),所以下面我們直接上例子嘍
例:跨頁(yè)面判斷是否是數(shù)組

從結(jié)果中可以看出,constructor和instanceof都沒(méi)有正確的判斷出類(lèi)型,只有object.prototype.toString.call();正確判斷出了
其實(shí)面試官也經(jīng)常喜歡讓說(shuō)一種最簡(jiǎn)單的判斷是數(shù)組的方法,記住嘍是object.prototype.toString.call()哦!
最后,做了這么多的鋪墊,該進(jìn)入我們深拷貝的實(shí)現(xiàn)了

此處對(duì)function進(jìn)行的簡(jiǎn)單的賦值。
參考文章鏈接:https://blog.csdn.net/lhjuejiang/article/details/79623973