前端經(jīng)典面試題之對(duì)象的深淺克隆-js

關(guān)于對(duì)象的深淺克隆

  1. 首先在我們的認(rèn)知中嫉父,存在這復(fù)合數(shù)據(jù)類(lèi)型壶冒,和基本數(shù)據(jù)類(lèi)型〗矗基本數(shù)據(jù)類(lèi)型在使用的時(shí)候是進(jìn)行傳值調(diào)用址,復(fù)合數(shù)據(jù)類(lèi)型是進(jìn)行一個(gè)傳址調(diào)用而咆。

  2. 所以我們?cè)趯?duì)象克隆的時(shí)候就會(huì)錯(cuò)誤的將同一個(gè)地址賦值到我們需要使用的一個(gè)新的變量之上,這樣我們?cè)谑褂玫臅r(shí)候幕袱。修改值得時(shí)候就會(huì)直接在地址中修改暴备,所以就會(huì)影響到原數(shù)組,這時(shí)候我們就可能會(huì)需要用到對(duì)象得深克隆

  3. 首先我先介紹幾種淺拷貝得方法來(lái)避免使用们豌。

    • Object.assign(),這是ES6中合并對(duì)象得方法涯捻,這是把第一個(gè)參數(shù)之后得參數(shù)全部復(fù)制到第一個(gè)對(duì)象中,這樣可以實(shí)現(xiàn)第一層的拷貝
    • 然后我們也可以利用ES6的展開(kāi)運(yùn)算符來(lái)實(shí)現(xiàn)對(duì)第一層的淺拷貝。
  4. 接著我們就介紹一下深拷貝了

    • 最常用的一種拷貝方式JSON.parse(JSON.stringify(object))

    該方法引發(fā)的問(wèn)題:

    1. 會(huì)忽略u(píng)ndefined
      1. 會(huì)忽略到symbol
      2. 不能序列化函數(shù)
      3. 不能解決循環(huán)引用的對(duì)象
    • 我們還可以使用lodash中的cloneDeep函數(shù)來(lái)進(jìn)行對(duì)象的深克隆
    • 最后我們可以使用自己的遞歸方法來(lái)進(jìn)行深克隆望迎。

    1.首先我們先判斷傳入的對(duì)象類(lèi)型障癌,然后我們根據(jù)這個(gè)類(lèi)型來(lái)創(chuàng)建target
    2.我們?cè)讷@取源對(duì)象所有的屬性名,包括不可枚舉的屬性
    3.之后我們遍歷所有的屬性名
    4.我們獲取每個(gè)屬性的描述對(duì)象
    5.在判斷該屬性是否是基礎(chǔ)數(shù)據(jù)類(lèi)型擂煞,如果是混弥,我們就直接將當(dāng)前屬性放入目標(biāo)對(duì)象中
    6.如果不是的話(huà)趴乡,我們就根據(jù)該屬性对省,重新創(chuàng)建一個(gè)引用
    7.因?yàn)镈OM非常的特殊蝗拿,所以我們先判斷該對(duì)象是否是DOM類(lèi)型,如果是的話(huà)我們直接復(fù)制當(dāng)前dom
    8.如果不是DOM,我們來(lái)判斷當(dāng)前屬性中原型的構(gòu)造
    9.我們根據(jù)構(gòu)造來(lái)創(chuàng)建一個(gè)類(lèi)型
    10.之后我們判斷該屬性的某個(gè)描述對(duì)象是否存在蒿涎,如果存在哀托,我們就給他們添加,
    11.這些完畢劳秋,我們?cè)诎旬?dāng)前引用傳入當(dāng)前函數(shù)仓手,進(jìn)行遞歸操作。
    最后我們將復(fù)制的后的值玻淑,返回出去

    function cloneObj(source, target) {
        var list = ["string", "number", "null", "undefined", "boolean", "function"]
        if (target === undefined) {
            // 先判斷是不是dom節(jié)點(diǎn),是就可以去直接clone節(jié)點(diǎn)
            if (HTMLElement.prototype.isPrototypeOf(source)) {
                target = source.cloneNode(false)
            } else {
                target = new source.constructor()
            }
        }
        // 獲取對(duì)象的所有屬性包括嗽冒,包擴(kuò)不可枚舉的屬性
        var names = Object.getOwnPropertyNames(source)
        for (var i = 0; i < names.length; i++) {
            var desc = Object.getOwnPropertyDescriptor(source, names[i])
            if (list.includes(typeof desc.value)) {
                Object.defineProperty(target, names[i], desc);
            } else {
                var t;
                if(HTMLElement.prototype.isPrototypeOf(desc.value)) {
                    t = desc.value.cloneNode(false)
                } else {
                    switch (desc.value.constructor) {
                        case RegExp:
                            t = new RegExp(desc.value.source, desc.value.flags)
                            break;
                        case Date:
                            t = new Date(desc.value)
                            break;
                        case Symbol:
                            t = Symbol
                            break;
                        case Set:
                            t = new Set(desc.value.values())
                            break;
                        case Map:
                            t = new Map(desc.value.entries())
                            break
                        default:
                            t = new desc.value.constructor();
                            break;
                    }
                }
                var o = {}
                o.value = t;
                desc.enumerable && (o.enumerable = desc.enumerable)
                desc.writable && (o.writable = desc.writable)
                desc.configurable && (o.configurable = desc.configurable)
                desc.set && (o.set = desc.set)
                desc.get && (o.get = desc.get)
                Object.defineProperty(target, names[i], o)
                console.log(desc.value,t)
                cloneObj(desc.value, t)
            }
        }
        return target
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市补履,隨后出現(xiàn)的幾起案子添坊,更是在濱河造成了極大的恐慌,老刑警劉巖箫锤,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贬蛙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谚攒,警方通過(guò)查閱死者的電腦和手機(jī)阳准,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)馏臭,“玉大人野蝇,你說(shuō)我怎么就攤上這事∥晃梗” “怎么了浪耘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)塑崖。 經(jīng)常有香客問(wèn)我七冲,道長(zhǎng),這世上最難降的妖魔是什么规婆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任澜躺,我火速辦了婚禮,結(jié)果婚禮上抒蚜,老公的妹妹穿的比我還像新娘掘鄙。我一直安慰自己,他們只是感情好嗡髓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布操漠。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浊伙。 梳的紋絲不亂的頭發(fā)上撞秋,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音嚣鄙,去河邊找鬼吻贿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛哑子,可吹牛的內(nèi)容都是我干的舅列。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼卧蜓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帐要!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起弥奸,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宠叼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后其爵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體冒冬,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年摩渺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了简烤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摇幻,死狀恐怖横侦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绰姻,我是刑警寧澤枉侧,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站狂芋,受9級(jí)特大地震影響榨馁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜帜矾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一翼虫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屡萤,春花似錦珍剑、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春别凤,著一層夾襖步出監(jiān)牢的瞬間劈愚,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工闻妓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掠械。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓由缆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親猾蒂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子均唉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • css相關(guān) 1. 萬(wàn)能居中 1.margin: 0 auto;水平 2.text-align: center;水平...
    chaocc閱讀 964評(píng)論 0 2
  • 如果你自以為會(huì)對(duì)象深拷貝的話(huà),快來(lái)看看這篇對(duì)象進(jìn)階的文章吧~~~ 1.創(chuàng)建對(duì)象 對(duì)象創(chuàng)建的三種方式var obj ...
    learninginto閱讀 561評(píng)論 6 10
  • 2018web前端最新面試題總結(jié) 一肚菠、Html/Css基礎(chǔ)模塊 基礎(chǔ)部分 什么是HTML舔箭?答:? HTML并不是...
    duans_閱讀 4,667評(píng)論 3 27
  • 久違的晴天,家長(zhǎng)會(huì)蚊逢。 家長(zhǎng)大會(huì)開(kāi)好到教室時(shí)层扶,離放學(xué)已經(jīng)沒(méi)多少時(shí)間了。班主任說(shuō)已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)烙荷。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評(píng)論 16 22
  • 今天感恩節(jié)哎镜会,感謝一直在我身邊的親朋好友。感恩相遇终抽!感恩不離不棄戳表。 中午開(kāi)了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,564評(píng)論 0 11