亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

前端經典面試題解密-add(1)(2)(3)(4) == 10到底是個啥?

前言

前端的小伙伴在面试的时候,几乎都会遇到一道这样的面试题: add(1)(2)(3)(4)输出结果为10。在第一次看到这道面试题的时候,很多小伙伴感到了迷茫!借用王宝强在《人在囧途》中的表演:啥啥啥,这写的都是啥?下面胡哥为各位小伙伴带来这道题的揭秘。

一、核心点-基础函数的变种-函数柯里化

我们从0开始,一点点儿的观察。add(1)(2)(3)(4)输出的值怎么成为10,很简单,大家都明白是1+2+3+4的累加。那使用基础函数是怎么实现的呢?

function add (a, b, c, d) {
	return a + b + c + d
}
add(1, 2, 3, 4) // 10

那如何add(1)(2)(3)(4)如何也输出10呢?小伙伴接下来可能会想到这样:

function add (a) {
	return function (b) {
		return function (c) {
			return function (d) {
				return a + b + c + d
			}
		}
	}
}

是不是很完美!

但是如果你这么回答面试官,面试官肯定会立刻怼死你,累加到100怎么办?(PS:没有说10000已经很客气了)

王老师经典语录:下面的是重点,圈起来,一定要考!!

函数柯里化概念: 柯里化(Currying)是把接受多个参数的函数转变为接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术。

二、函数柯里化解决方案

函数柯里化有两种不同的场景,一种为函数参数个数定长的函数,另外一种为函数参数个数不定长的函数。

  1. 函数参数个数定长的柯里化解决方案

    // 定长参数
    function add (a, b, c, d) {
    	return [
    	  ...arguments
    	].reduce((a, b) => a + b)
    }
    
    function currying (fn) {
    	let len = fn.length
    	let args = []
    	return function _c (...newArgs) {
    		// 合并参数
    		args = [
    			...args,
    			...newArgs
    		]
    		// 判断当前参数集合args的长度是否 < 目标函数fn的需求参数长度
    		if (args.length < len) {
    			// 继续返回函数
    			return _c
    		} else {
    			// 返回执行结果
    			return fn.apply(this, args.slice(0, len))
    		}
    	}
    }
    let addCurry = currying(add)
    let total = addCurry(1)(2)(3)(4) // 同时支持addCurry(1)(2, 3)(4)该方式调用
    console.log(total) // 10
    
  2. 函数参数个数不定长的柯里化解决方案

    问题升级:那这个问题再升级一下,函数的参数个数不确定时,如何实现呢?

    function add (...args) {
    	return args.reduce((a, b) => a + b)
    }
    
    function currying (fn) {
    	let args = []
    	return function _c (...newArgs) {
    		if (newArgs.length) {
    			args = [
    				...args,
    				...newArgs
    			]
    			return _c
    		} else {
    			return fn.apply(this, args)
    		}
    	}
    }
    
    let addCurry = currying(add)
    // 注意调用方式的变化
    console.log(addCurry(1)(2)(3)(4, 5)())
    

后记

以上就是胡哥今天给大家分享的内容,喜欢的小伙伴记得收藏转发、点击推荐呀,推荐给更多小伙伴,欢迎多多留言交流…

胡哥有话说,一个有技术,有情怀的胡哥!现任京东前端攻城狮一枚。
胡哥有话说,专注于大前端技术领域,分享前端系统架构,框架实现原理,最新最高效的技术实践!

點擊查看更多內容
4人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
全棧工程師
手記
粉絲
28
獲贊與收藏
169

關注作者,訂閱最新文章

閱讀免費教程

感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消