JavaScript (函数篇 II)


\(update : 2022.1.23\)

学习原文


\(① : 高阶函数\)

一个函数作为另一个函数的参数 , 那么我们就称这个函数为高阶函数.

例子

function add(x,y,f){
	return f(x) + f(y);
}
var x = add(-3,5,Math.abs);
console.log(x) // 8

\(② : map/reduce\)

\(update : 2022.1.24\) 忘了函数一般是返回值 ,传入的数组本身不改变.

map

要注意的是 map 作用于 Array , Array.map(f) , 其中 f 是一个函数 , 它作用于 Array 的每一个元素 , 并整体返回一个新的Array , 注意是返回值 , 原本的 Array 并不改变.

举例

'use strict';
function pow(x) {
    return x * x;
}
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var results = arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
console.log(results);//1,4,5,16,25,36,49,64,81 , 注意是返回值 , result用于接受.

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9'] // 可以是自己定义的函数 , 也可以是原有的函数.

reduce() 同样作用于 Array 上 , 这个函数必须接受两个参数 , 且结果与下个元素做累计计算.
举例 : [x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4) 

var arr = [1, 3, 5, 7, 9];
var t = arr.reduce(function (x, y) {
    return x + y;
}); // 25
console.log(t) //25 , 也要注意它是一个返回值 , 并且在reduce(); , 括号里面定义函数.


练习中有这样的题

讲字符串化为数组元素再化为对应的整数

function string2int(s){
	var arr = [];
	for(var i=0;i(c*1)).reduce((x,y)=>(x*10+y));
   
将数组中的字符串首字母大写 , 其余小写.
function normalize(arr){
	function ex(s){
		return s[0].toUpperCase()+s.substring(1).toLowerCase();
	}
	return arr.map(ex);
}
//评论给出更简洁的做法
 return arr.map(name=>name[0].toUpperCase()+name.substring(1).toLowerCase());
 

最后作者给出思考题.
'use strict';
var arr = ['1', '2', '3'];
var r;
r = arr.map(parseInt);
console.log(r);
答案竟是 1 NaN NaN.

不懂 , 看了评论
**parseInt(string, radix)  ** 解析一个字符串并返回指定基数的十进制整数, radix 是2-36之间的整数,表示被解析字符串的基数 , 注意第二位是基数.

map方法的函数只要一个参数,但是map传递的参数有三个,分别是:数组元素、元素索引,数组本身,而paresInt是可以接受两个参数的,第一个是字符,第二个是进制基数.

['1', '2', '3'].map(paresInt(value, index))
第一个元素就是:paresInt('1', 0)  > 1
第二个元素就是:paresInt('2', 1)  >  NaN //一进制下 2 的出现就不合理 , 并且 radix >=2 .
第三个元素就是:paresInt('3', 2)  >  NaN //二进制下 3 的出现就不合理 .