廖雪峰博客高阶函数的答案:
selfHigherOrderFn: function () {
// demo1 求和
function sum (fn, ...num1) {
const nums = Array.from(arguments).slice(1);
let total = 0;
nums.forEach((item, index, arr) => {
console.log('forEach item: ', item);
total += fn(item);
});
console.log('argument: ', arguments, 'nums: ', nums);
return total;
}
const result = sum(Math.abs, -2, 1, 3, 4);
console.log('result: ', result);
// demo2 任意一字符串转化为首字母大写
function capitalize (str) {
str = str.toString().toLowerCase();
return str[0].toUpperCase() + str.substring(1);
}
function stringFormat(fn, str) {
return fn(str);
}
const str = stringFormat(capitalize, 'stEsdsdB');
console.log('str: ', str);
},
arrayHigherOrderFn: function () {
// Array.prototype.map
const arr = [1, 3, 23, 5, 8, 10];
let resultArr = arr.map((item, index, arr) => {
return item * item;
});
console.log('Array.prototype.map resultArr: ', resultArr);
// Array.prototype.reduce
let sum = arr.reduce((total, item, index, arr) => {
return total + item;
});
let sum2 = arr.reduce((total, item, index, arr) => {
return total + item;
}, 2);
console.log('Array.prototype.reduce sum: ', sum, ', sum2:', sum2);
const _self = this;
function product (arr) {
return _self.TB.isArray(arr) ? arr.reduce((total, item, index, arr) => {
return total * item;
}, 1) : 0;
}
let _product = product([2, 4, 3, 5]);
console.log('the product of arr: ', _product);
// 不要使用JavaScript内置的parseInt()函数,利用map和reduce操作实现一个string2int()函数
function string2int(str) {
const arr = str.split('');
return arr.map((item, index, arr) => {
return item - 0;
}).reduce((total, item, index, arr) => {
return total * 10 + item;
});
}
let result = string2int('323422');
console.log('string2int result: ', result, ', result type: ', typeof(result));
// 请把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']。
function capitalize (str) {
return str.substring(0, 1).toUpperCase() + str.substring(1).toLowerCase();
}
function formatStringArray (arr) {
return arr.map((item, index, arr) => {
return capitalize(item);
});
}
let formatResult = formatStringArray(['adam', 'LISA', 'barT']);
console.log('formatStringArray result: ', formatResult);
/*
*小明希望利用map()把字符串变成整数,他写的代码很简洁
*var arr = ['1', '2', '3'];
*var r;
*r = arr.map(parseInt);
*结果竟然是1, NaN, NaN,小明百思不得其解,请帮他找到原因并修正代码。
*
*分析:
*首先map函数的形式arr.map((item, index, arr) => {}, thisArg);
*item表示数组的每个元素,index表示数组的下标,arr表示数组本身,thisArg表示this的指向
*现在再看parseInt函数parseInt(str, raIndex)
*str表示待转换数字的字符串,raIndex表示转换为几进制(2-36之间的是2的指数的数字)
*所以上面的函数的遍历过程是:
*parseInt('1', 0); //0表示没有,直接转换为默认的10进制正数:1
*parseInt('2', 1); //没有1进制: NaN
*parseInt('3', 2); //二进制,但是二进制中没有3:,只有1和0:NaN
*
*/