成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

讓前端面試不在難(深度克隆 clone)

hover_lew / 545人閱讀

摘要:今天聊一下這個(gè)前端面試高頻問(wèn)題,由此引出這些。下面我們先詳細(xì)的聊一下,完了解決下面試官的問(wèn)題。數(shù)組之所以為是因?yàn)樯线呎f(shuō)了和其實(shí)就是想說(shuō)這兩個(gè)對(duì)于深度的實(shí)現(xiàn)來(lái)說(shuō)不夠嚴(yán)謹(jǐn)要不就是多層判斷。

今天聊一下clone這個(gè)前端面試高頻問(wèn)題,由此引出typeof、instanceof、Object.prototype.toString這些javascript Api。

下面我們先詳細(xì)的聊一下,完了解決下面試官的問(wèn)題。

typeof

typeof能獲取一個(gè)變量或表達(dá)式的類(lèi)型。

原始類(lèi)型

Boolean

Null

Undefined

String

Symbol

Number

Symbol

和?引用類(lèi)型 Object,F(xiàn)unction

下面看一些栗子

        //基礎(chǔ)類(lèi)型也可以說(shuō)非引用類(lèi)型
        let str = "hello word!"
        console.log(typeof str) //string
        let num = 12
        console.log(typeof num) //number
        let udf = undefined
        console.log(typeof udf) //undefined
        let bl = true
        console.log(typeof bl) //boolean
        let nl = null
        console.log(nl) //null
        let sl = Symbol()
        console.log(typeof sl) //symbol

        //復(fù)合類(lèi)型也可以說(shuō)是引用類(lèi)型,
        let obj = {
            a: 1
        }
        console.log(typeof obj) //object
        let arr = [1, 2, 3]
        console.log(typeof arr) //object

        //函數(shù)也屬于引用類(lèi)型,不過(guò)typeof卻能準(zhǔn)確的返回類(lèi)型
        function fn() {}
        console.log(typeof fn) //function

從以上的執(zhí)行結(jié)果可以看出,typeof不能夠準(zhǔn)確分返回所有類(lèi)型

instenceof

我們從instenceof的實(shí)現(xiàn)來(lái)了解下instenceof是干什么的

        // 模擬instenceof實(shí)現(xiàn)
        // 1、instenceof接收兩個(gè)參數(shù)
        // 2、返回true或false

        function myInstenceof(X, Y) {
            let L = X._proto_
            let R = Y.prototype
            if (L !== R) {
                return false
            }
            return true
        }

        // test
        function Fn() {

        }
        let newFn = new Fn()
        console.log(newFn)
        console.log(new Fn())


        console.log(myInstenceof(newFn, new Fn())) //true
        console.log(myInstenceof([], new Array())) //true
        console.log(myInstenceof([], new Object())) //true

以上demo我們就能看出,instenceof也不夠靠譜,模擬實(shí)現(xiàn)就是判斷X的原型知否在Y的原型鏈上。
數(shù)組之所以instenceof Object為true是因?yàn)?[].prototype->new Array->new Object->null

上邊說(shuō)了typeof和instenceof其實(shí)就是想說(shuō)這兩個(gè)對(duì)于深度clone的實(shí)現(xiàn)來(lái)說(shuō)不夠嚴(yán)謹(jǐn)要不就是多層判斷。

Object.prototype.toString.call()

接下里我們說(shuō)個(gè)靠譜的

        Object.prototype.toString.call(""); // [object String]
        Object.prototype.toString.call(1); // [object Number]
        Object.prototype.toString.call(true); // [object Boolean]
        Object.prototype.toString.call(undefined); // [object Undefined]
        Object.prototype.toString.call(null); // [object Null]
        Object.prototype.toString.call(new Function()); // [object Function]
        Object.prototype.toString.call(new Date()); // [object Date]
        Object.prototype.toString.call([]); // [object Array]
        Object.prototype.toString.call(new RegExp()); // [object RegExp]
        Object.prototype.toString.call(new Error()); // [object Error]
        Object.prototype.toString.call(document); // [object HTMLDocument]
        Object.prototype.toString.call(window); //[object Window]

靠譜!

接下來(lái)我們就用Object.prototype.toString.call()來(lái)解答一下面試題

      function clone(obj, o) {
            //Object.prototype.toString.call(obj)返回類(lèi)似[Object Array] 利用slice來(lái)截取我們需要的字符串
            let type = Object.prototype.toString.call(obj).slice(8, -1)
                // 如果是Object
            if (type === "Object") {
                o = {}
                for (let k in obj) {
                    o[k] = clone(obj[k]);
                }
                // 如果是對(duì)象
            } else if (type === "Array") {
                o = []
                for (let i = 0; i < obj.length; i++) {
                    o.push(clone(obj[i]));
                }
            } else {
                // 非引用類(lèi)型
                o = obj
            }
            return o
        }

        let obj1 = {
            a: [1, 2, 3, 4, 5, 6],
            b: {
                c: 2
            },
            d: 1,
            f: function() {
                return 1
            }
        }
        let obj2 = clone(obj1)
        obj2.f = function() {
            return 2
        }
        obj2.a = 1
        console.log(obj1)
        console.log(obj2)

測(cè)試打印結(jié)果,obj2的改變不會(huì)影響到obj1。

歡迎吐槽!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108938.html

相關(guān)文章

  • Java實(shí)現(xiàn)對(duì)象克隆的方法

    摘要:優(yōu)點(diǎn)簡(jiǎn)單易實(shí)現(xiàn)缺點(diǎn)無(wú)法真正克隆對(duì)象深克隆實(shí)現(xiàn)通過(guò)遞歸克隆實(shí)現(xiàn)代碼輸出通過(guò)序列化實(shí)現(xiàn)代碼輸出結(jié)果分析采用深克隆能有效隔離源對(duì)象與克隆對(duì)象的聯(lián)系。 本文首發(fā)于cartoon的博客 ????轉(zhuǎn)載請(qǐng)注明出處:https://cartoonyu.github.io/cartoon-blog/post/java/java%E5%AE%9E%E7%8E%B0%E5%85%8B%E9%9A%86%E...

    zhoutk 評(píng)論0 收藏0
  • 前端一些需要掌握的簡(jiǎn)單知識(shí)點(diǎn)

    摘要:快速排序由在年提出。如果定時(shí)器的時(shí)間到了,那么也會(huì)去下一個(gè)階段關(guān)閉的回調(diào)函數(shù),一些準(zhǔn)備關(guān)閉的函數(shù)等的事件輪詢(xún)機(jī)制也可以看成是單線程,由上往下執(zhí)行,但是到了第階段,又會(huì)返回第一階段,死循環(huán)。 原生javaScript是中大公司挑人的核心,也是決定你未來(lái)發(fā)展高度的核心。 冒泡排序,快速排序,深度克隆,深度凍結(jié),數(shù)組操作,本章都有。 走遍大江南北,還是原生javaScript最美 感冒給大...

    n7then 評(píng)論0 收藏0
  • 前端一些需要掌握的簡(jiǎn)單知識(shí)點(diǎn)

    摘要:快速排序由在年提出。如果定時(shí)器的時(shí)間到了,那么也會(huì)去下一個(gè)階段關(guān)閉的回調(diào)函數(shù),一些準(zhǔn)備關(guān)閉的函數(shù)等的事件輪詢(xún)機(jī)制也可以看成是單線程,由上往下執(zhí)行,但是到了第階段,又會(huì)返回第一階段,死循環(huán)。 原生javaScript是中大公司挑人的核心,也是決定你未來(lái)發(fā)展高度的核心。 冒泡排序,快速排序,深度克隆,深度凍結(jié),數(shù)組操作,本章都有。 走遍大江南北,還是原生javaScript最美 感冒給大...

    liuhh 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<