←首页

今天去了一家创业公司面试,碰上道不太常见的笔试题。

1
2
3
// 写一个 function 让下面两行代码输出的结果都为 5
console.log(sum(2, 3));
console.log(sum(2)(3));

说实话,第一眼看到的时候心里是有点虚的(因为第一次看到它)。sum(2)(3),这种形式的代码确实少见。但是第一反应就是链式调用。
链式调用我们熟悉啊,特别是 jQuery 里面,我们常常能看到连着写的代码。实现原理就是在方法结束时 return 合适的元素对象。

1
2
3
$('#id').parent().siblings('selector').css({
color: 'red'
});

这道题考什么呢?认真分析了一下,应该有链式调用,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
27
var sum = (function() {
var list = [];
var add = function() {
// 拼接数组
var args = Array.prototype.slice.call(arguments);
list = list.concat(args);
return add;
}
// 覆盖 toString 方法
add.toString = function() {
// 计算总和
var sum = list.reduce(function(pre, next) {
return pre + next;
});
// 清除记录
list.length = 0;
return sum;
}
return add;
})();
sum(2, 3);
// 5
sum(2)(3);
// 5

Done.

但是面试官看完说,你把问题复杂化了,可以用更简单的方式解决。Orz,回到家,带着好奇心和求知欲马上搜了一下。

1
2
3
4
5
6
7
8
var add = function add() {
var cache;
if (arguments.length === 1) {
cache = arguments[0];
return function ( number ) {return cache + number;};
}
else return arguments[0] + arguments[1];
};

好吧,这样的代码确实可以解决现有的问题。但是如果参数不止两个呢?你有更好的解决方式吗?

如需转载,请注明出处: http://w3ctrain.com/2017/02/17/sum-of-bitch/

blog comments powered by Disqus