函数toString的妙用(字节跳动二面)

字节跳动(今日头条)二面出的一道题

1
2
3
sum(1, 2, 3, 4, 5)
sum(1)(2)(3)(4)(5)
// 要求输出一致

我感觉就是问一个闭包而已

我的答案(…好吧,不是现场给的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function add() {

let arg1 = Number(arguments[0]);
let flag = true;
// if (!arg1) return 0;

if (arguments.length > 1) {
return [].slice.call(arguments).reduce((prev, next) => {
return prev + next;
}, 0);
} else {
return function() {
return arg1 + sum(arguments[0]);
}
}
}

尼玛…毫无疑问,二面懵逼的挂了。

这什么鬼逻辑才想出这样…递归的后面返回是个函数,还用加法…白给

把代码改成下面这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function add() {

let sum = arguments[0] ? Number(arguments[0]) : 0;

const tempFunc = function(num) {
sum += num;
console.log(sum)
return tempFunc;
}
if (arguments.length > 1) {
return [].slice.call(arguments).reduce((prev, next) => {
return prev + next;
}, 0);
} else {
return function() {
const a = tempFunc(arguments[0]);
return a;
}
}
}
console.log(add(1, 2, 3, 4, 5))
console.log(add(1)(2)(3)(4)(5))

会发现最后输出了一个函数,这时候toString()就派上用场了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 重写tempFunc的toString
function add() {

let sum = arguments[0] ? Number(arguments[0]) : 0;

const tempFunc = function(num) {
sum += num;
console.log(sum)
return tempFunc;
}
tempFunc.toString = function() {
return sum;
}
if (arguments.length > 1) {
return [].slice.call(arguments).reduce((prev, next) => {
return prev + next;
}, 0);
} else {
return function() {
// 注意这里的一个小细节,卡了我好久
// 我直接写成tempFunc(arguments[0])了,要return a,不然add(1)(2)是undefined
const a = tempFunc(arguments[0]);
return a;
}
}
}

把最后结果返回就可以了,不过这也是为了应付面试而已…肯定有更优解。

-------------要说再见啦感谢大佬的光临~-------------