今天,有个同学问我一个问题:
add(1) //1
add(1)(2) //3
add(1)(2)(3) //返回6
....
我想了半天,实在想不出来,在我看来, 这是矛盾的,
因为通过add(1)(2)返回3,要求add(1)的返回值是一个函数,才能接收参数2,但是add(1)却是1,不管是字符串还是数字,这都是不可能的。
后来看了答案,才恍然大悟,原来这打印出来的函数的执行结果,必须调用toString方法。
1 function demo(...args) { 2 var adds = args.reduce((prev, next) => prev + next, 0);//第一次执行时候才会执行, 其他时候不执行 3 function fn(...arguments) {//第一次的执行结果,以后都是该函数执行 4 5 adds = arguments.reduce((prev, next) => prev + next, adds) 6 return fn; 7 } 8 fn.toString = function () {//最让我想不明白的就是这个地方,一旦打印fn(因为函数连锁调用的结果是fn),则调用它的toString方法。 9 return adds; 10 } 11 return fn;//第一次执行时才会执行,以后的所有执行都是执行fn函数; 12 }
第二个同学问我的问题是:如何用最简单的代码实现快速排序;
快速排序的思想是:对一组数字,进行两步走:先找出参照物(通常是第一个),其次遍历这组数,比参照物大的放右面,比参照物小的放左边, 然后递归对左右快速排序。代码实现如下:
1 var arr = [5, 2, 6, 4, 3, 8, 7, 1]; 2 function sort(arr) { 3 // 出口是只有一个数,不需要排序, 则直接返回该数组 4 if (arr.length < 2) return arr; 5 var leader = arr[0];//选出参照物(首领) 6 var left = [], 7 right = []; 8 for (var i = 1; i < arr.length; i++) {//从第一个开始遍历,而不是第0个 9 if (arr[i] > leader) { 10 right.push(arr[i]); 11 } else { 12 left.push(arr[i]) 13 } 14 } 15 return sort(left).concat(leader).concat(sort(right))//递归遍历左右两个数组 16 } 17 console.log(sort(arr));