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

資訊專欄INFORMATION COLUMN

面試題:函數(shù)柯里化

wudengzan / 3488人閱讀

摘要:題目發(fā)現(xiàn)一道有意思的面試題如何實(shí)現(xiàn)首先簡(jiǎn)單分析一下,我們就能發(fā)現(xiàn)這是一個(gè)函數(shù)傳值次得到。簡(jiǎn)單實(shí)現(xiàn)利用閉包,執(zhí)行函數(shù)時(shí)一個(gè)匿名函數(shù),用于最終返回結(jié)果。當(dāng)然,這個(gè)方法有個(gè)明顯缺陷,就是如果函數(shù)變成,我們就又要手動(dòng)嵌套一層。

題目

發(fā)現(xiàn)一道有意思的面試題:如何實(shí)現(xiàn) add(1)(2)(3)=6 ?

首先簡(jiǎn)單分析一下,我們就能發(fā)現(xiàn)這是一個(gè)函數(shù)傳值 return3次得到6 。

簡(jiǎn)單實(shí)現(xiàn)
function add(a) {
    return function (b) {
        return function (c) {
            return a + b + c;
        }
    }
}

利用閉包,執(zhí)行add函數(shù)時(shí)return一個(gè)匿名函數(shù),用于最終返回結(jié)果。

當(dāng)然,這個(gè)方法有個(gè)明顯缺陷,就是如果函數(shù)變成 add(1)(2)(3)(4) ,我們就又要手動(dòng)嵌套一層。

分析

有沒有什么辦法呢? 有!

我們先把這個(gè)問題簡(jiǎn)化一下:

如何實(shí)現(xiàn)函數(shù)對(duì)自身的調(diào)用呢,如: add()()() ?

function add () {
    // 方法1:利用apply
    return function () {
        return add.apply();
    }
    // 方法2:
    // return add;
}

那么,問題就可以這么實(shí)現(xiàn):

function add () {
    var args = Array.prototype.slice.call(arguments);
    console.log(args);
    var fn = function () {
        var fn_args = Array.prototype.slice.call(arguments);
        return add.apply(null, args.concat(fn_args));
    };
    return fn;
}

至此, add 函數(shù)的多層嵌套以及所有參數(shù),我們都拿到了,下面只需要把參數(shù)相加就可以了。

但我們不能直接相加,因?yàn)槲覀?add 函數(shù) return add.apply() 返回的是函數(shù), 因此即使相加,值我們也是拿不到的。

valueOf

這里我們要用到 valueOf 方法。
valueOf 方法返回指定對(duì)象的原始值。

function add () {
    var args = Array.prototype.slice.call(arguments);
    var fn = function () {
        var fn_args = Array.prototype.slice.call(arguments);
        return add.apply(null, args.concat(fn_args));
    };
    fn.valueOf = function () {
        return args.reduce(function (a, b) {
            return a + b;
        });
    };
    return fn;
}

搞定!現(xiàn)在這個(gè)方法不僅支持 add(1)(2)(3) 而且支持 add(1,2,3) 。

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

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

相關(guān)文章

  • 從一道面試談?wù)?em>函數(shù)柯里(Currying)

    摘要:忍者秘籍一書中,對(duì)于柯里化的定義如下在一個(gè)函數(shù)中首先填充幾個(gè)參數(shù)然后再返回一個(gè)新函數(shù)的技術(shù)稱為柯里化?;氐轿覀兊念}目本身,其實(shí)根據(jù)測(cè)試用例我們可以發(fā)現(xiàn),函數(shù)的要求就是接受單一函數(shù),例如但是與柯里化不同之處在于,柯里化返回的一個(gè)新函數(shù)。   歡迎大家再一次來到我的文章專欄:從面試題中我們能學(xué)到什么,各位同行小伙伴是否已經(jīng)開始了悠閑的春節(jié)假期呢?在這里提前祝大家雞年大吉吧~哈哈,之前有人說...

    cppprimer 評(píng)論0 收藏0
  • 「前端面試系列6」理解函數(shù)柯里

    摘要:原題如下寫一個(gè)方法,當(dāng)使用下面的語(yǔ)法調(diào)用時(shí),能正常工作這道題要考察的,就是對(duì)函數(shù)柯里化的理解。當(dāng)參數(shù)只有一個(gè)的時(shí)候,進(jìn)行柯里化的處理。這其實(shí)就是函數(shù)柯里化的簡(jiǎn)單應(yīng)用。 showImg(https://segmentfault.com/img/bVbopGm?w=620&h=350); 前言 這是前端面試題系列的第 6 篇,你可能錯(cuò)過了前面的篇章,可以在這里找到: ES6 中箭頭函數(shù)的...

    liaorio 評(píng)論0 收藏0
  • 從一道面試認(rèn)識(shí)函數(shù)柯里

    摘要:函數(shù)柯里化在函數(shù)式編程中,函數(shù)是一等公民。函數(shù)柯里化的主要作用和特點(diǎn)就是參數(shù)復(fù)用提前返回和延遲執(zhí)行??赡茉趯?shí)際應(yīng)用場(chǎng)景中,很少使用函數(shù)柯里化的解決方案,但是了解認(rèn)識(shí)函數(shù)柯里化對(duì)自身的提升還是有幫助的。 最近在整理面試資源的時(shí)候,發(fā)現(xiàn)一道有意思的題目,所以就記錄下來。 題目 如何實(shí)現(xiàn) multi(2)(3)(4)=24? 首先來分析下這道題,實(shí)現(xiàn)一個(gè) multi 函數(shù)并依次傳入?yún)?shù)執(zhí)行,...

    13651657101 評(píng)論0 收藏0
  • 一道柯里面試

    摘要:這是一道朋友在群里發(fā)的一道題,我之前不是很懂柯里化,就自己試著寫了一下,不知道算不算柯里化,望指教下面是題目寫好之后一下代碼可以正常運(yùn)行輸入正確我自己的代碼我用到了以下知識(shí)點(diǎn)擴(kuò)展運(yùn)算符傳參和擴(kuò)展運(yùn)算符相關(guān)的數(shù)組操作。 這是一道朋友在群里發(fā)的一道題,我之前不是很懂柯里化,就自己試著寫了一下,不知道算不算柯里化,望指教~ 下面是題目: function curry() { ...

    andycall 評(píng)論0 收藏0
  • 高級(jí)函數(shù)技巧-函數(shù)柯里

    摘要:如果你對(duì)函數(shù)式編程有一定了解,函數(shù)柯里化是不可或缺的,利用函數(shù)柯里化,可以在開發(fā)中非常優(yōu)雅的處理復(fù)雜邏輯。同樣先看簡(jiǎn)單版本的方法,以方法為例,代碼來自高級(jí)程序設(shè)計(jì)加強(qiáng)版實(shí)現(xiàn)上面函數(shù),可以換成任何其他函數(shù),經(jīng)過函數(shù)處理,都可以轉(zhuǎn)成柯里化函數(shù)。 我們經(jīng)常說在Javascript語(yǔ)言中,函數(shù)是一等公民,它們本質(zhì)上是十分簡(jiǎn)單和過程化的??梢岳煤瘮?shù),進(jìn)行一些簡(jiǎn)單的數(shù)據(jù)處理,return 結(jié)果,...

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

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

0條評(píng)論

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