前端面試準(zhǔn)備

手寫call渤涌、apply

https://github.com/mqyqingfeng/Blog/issues/11

Function.prototype.myCall = function (thisTarger) {
    var thisTarget = thisTarget || window
    thisTarger.f = this
    args = []
    for (var i = 1; i < arguments.length; ++i) {
        args.push('arguments[' + i + ']')
    }
    var result = eval('thisTarger.f(' + args + ')')
    delete thisTarger.f
    return result
}

注意傳參用'arguments[' + i + ']'的方式距辆,eval之后才能正常調(diào)用

Function.prototype.myApply = function (thisTarget, arr) {
    var thisTarget = thisTarget || window
    thisTarget.f = this
    var args = []
    var result

    if (arr) {
        for (var i = 0; i < arguments.length; ++i) {
            args.push('arr[' + i + ']')
        }
        result = eval('thisTarget.f(' + args + ')')
    } else {
        result = thisTarget.f()
    }
    return result
}

注意遍歷arr是從0開始的

手寫bind

https://github.com/mqyqingfeng/Blog/issues/12

Function.prototype.myBind = function (thisTarget) {
    var that = this
    var args = Array.prototype.slice.apply(arguments, 1)

    var boundF =  function () {
        var bindArgs = Array.prototype.slice.call(arguments)
        return that.apply(this instanceof boundF ? this : thisTarget, args.concat(bindArgs))
    }

    boundF.prototype = Object.create(this)
    return boundF
}

bind的要點(diǎn)比較多,主要是注意一下幾個(gè)特性的實(shí)現(xiàn):

  • 允許在bind和調(diào)用時(shí)分別傳參
    這個(gè)特性是通過把bind的傳參和調(diào)用傳參concat實(shí)現(xiàn)的
  • 可以使用new執(zhí)行構(gòu)造函數(shù)
    因?yàn)閚ew會(huì)把this指向一個(gè)新對象酒请,所以不能再用thisTarget作為調(diào)用時(shí)的this

下面具體說一下如何判斷使用new的

從手寫new我們知道new會(huì)返回一個(gè)對象,構(gòu)造函數(shù)在調(diào)用時(shí)滿足兩個(gè)條件:

  • this指向了這個(gè)新對象
  • 構(gòu)造函數(shù)的prototype在新對象的原型鏈上

this是新對象,那么只要判斷構(gòu)造函數(shù)是不是在新對象的原型鏈上就可以了逆济。所以this instanceof boundFtrue也就是boundFthis的原型鏈上時(shí),是在使用new,這個(gè)時(shí)候只能用new傳入的this來調(diào)用奖慌。

手寫new

https://github.com/mqyqingfeng/Blog/issues/13

function myNew() {
    var obj = Object()
    var constructor = Array.prototype.shift.call(arguments)
    obj.__proto__ = Object.create(constructor.prototype)
    var ret = constructor.apply(obj, arguments)
    return typeof ret === 'object' ? ret : obj
}

var person = myNew(Persen, 'Kevin', '18')

通過這個(gè)可以理解new做了什么抛虫。new會(huì)把一個(gè)新對象obj作為構(gòu)造函數(shù)的this引用調(diào)用構(gòu)造函數(shù),同時(shí)把新對象的原型指向構(gòu)造函數(shù)的原型升薯。

又根據(jù)使用構(gòu)造函數(shù)的不同用兩種情況:

  • 構(gòu)造函數(shù)返回一個(gè)object莱褒,則返回這個(gè)對象,注意this在開始已經(jīng)被指向了obj涎劈。
  • 構(gòu)造函數(shù)不返回object广凸,則直接返回obj

這里用了Object.create(constructor.prototype)來用一個(gè)中間變量代理構(gòu)造函數(shù)的原型,這樣可以保證獨(dú)立性蛛枚,寄生繼承也用到了這個(gè)方法谅海。

手寫Ajax

var reqeust = () => {
    if (XMLHttpRequest) {
        return new XMLHttpRequest()
    } else {
        return new ActiveXObject('Microsoft.XMLHTTP')
    }
}

request.onreadystatechange(function () {
    if (request.readyState === 4) {
        if (request.status === 200) {
            console.log('success');
        } else {
            console.log('failed');
        }
    } else {
        console.log('reqeusting...');
    }
})

reqeust.open('GET', 'http://www.baidu.com')
reqeust.send()

readyState:

  • new XMLHttpRequest(): 0
  • open(): 1
  • send(): 2
  • 下載中: 3
  • 完成: 4

手寫倒計(jì)時(shí)

https://juejin.im/post/5bcd89d5e51d4579bb1c5e22

let countdown = 100000; // ms 服務(wù)器返回的倒計(jì)時(shí)剩余時(shí)間
let countIndex = 1; // 倒計(jì)時(shí)任務(wù)執(zhí)行次數(shù)
const timeout = 1000; // 觸發(fā)倒計(jì)時(shí)任務(wù)的時(shí)間間隙
const startTime = new Date().getTime();

startCountdown(timeout);

function startCountdown(interval) {
    setTimeout(() => {
        const endTime = new Date().getTime();
        // 偏差值
        const deviation = endTime - (startTime + countIndex * timeout);
        console.log(`${countIndex}: 偏差${deviation}ms`);

        countIndex++;

        // 下一次倒計(jì)時(shí)
        startCountdown(timeout - deviation);
    }, interval);
}

核心思想:每次生成一個(gè)Date()算偏差

修正倒計(jì)時(shí)的思路:

  • 用起始服務(wù)器時(shí)間作為時(shí)間基準(zhǔn)
  • 每次修正
  • 達(dá)到誤差閾值后重新獲取服務(wù)器時(shí)間計(jì)時(shí)

手寫快排

function quickSort(arr, start, end) {
    var i = start, j = end
    var X = arr[i]
    
    if (i < j){
        while (i < j) {
            while (j > i && arr[j] > X) {
                j--
            }
            if (j > i) {
                arr[i++] = arr[j]
            }
            while (i < j && arr[i] < X) {
                i++
            }
            if (j > i) {
                arr[j--] = arr[i]
            }
        }
        arr[j] = X
        quickSort(arr, start, j - 1)
        quickSort(arr, j + 1, end)
    }
}

要注意的地方:

  • 一定要做i < j的判斷才進(jìn)入循環(huán),不然j會(huì)一直變小遞歸不會(huì)退出
  • 要先從j走蹦浦,因?yàn)橥诳油诘氖莍這一端
  • 如果要用隨機(jī)參考值優(yōu)化的話扭吁,需要變量來指示一下坑在哪個(gè)位置,i和j的位置不會(huì)變

最長公共子序列

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盲镶,一起剝皮案震驚了整個(gè)濱河市侥袜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌溉贿,老刑警劉巖枫吧,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宇色,居然都是意外死亡九杂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門宣蠕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來例隆,“玉大人,你說我怎么就攤上這事抢蚀《撇悖” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵思币,是天一觀的道長鹿响。 經(jīng)常有香客問我,道長谷饿,這世上最難降的妖魔是什么惶我? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮博投,結(jié)果婚禮上绸贡,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好听怕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布捧挺。 她就那樣靜靜地躺著,像睡著了一般尿瞭。 火紅的嫁衣襯著肌膚如雪闽烙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天声搁,我揣著相機(jī)與錄音黑竞,去河邊找鬼。 笑死疏旨,一個(gè)胖子當(dāng)著我的面吹牛很魂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播檐涝,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼遏匆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谁榜?” 一聲冷哼從身側(cè)響起幅聘,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窃植,沒想到半個(gè)月后喊暖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撕瞧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狞尔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丛版。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖偏序,靈堂內(nèi)的尸體忽然破棺而出页畦,到底是詐尸還是另有隱情,我是刑警寧澤研儒,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布豫缨,位于F島的核電站,受9級特大地震影響端朵,放射性物質(zhì)發(fā)生泄漏好芭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一冲呢、第九天 我趴在偏房一處隱蔽的房頂上張望舍败。 院中可真熱鬧,春花似錦、人聲如沸邻薯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厕诡。三九已至累榜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灵嫌,已是汗流浹背壹罚。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留醒第,地道東北人渔嚷。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像稠曼,于是被迫代替她去往敵國和親形病。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348