练习1:
不要使用JavaScript内置的parseInt()
函数,利用map和reduce操作实现一个string2int()
函数:
function string2int(s) {
function str2num(str){
var strArr = str.split(''); //把字符串分割成字符串数组
function toInt(data){
return +data; //通过js的弱类型转换,实现字符类型到数字类型的转换
}
var numArr = strArr.map(toInt); //通过map()把字符串数组转换成数字数组
return numArr;
}
var num = str2num(s);
var res = num.reduce(function (x,y) { //通过reduce()把数字数组转换成数字量
return x*10+y;
});
return res;
}
请把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT']
,输出:['Adam', 'Lisa', 'Bart']
。
function normalize(arr) {
function changetoName(name){
var newname = name[0].toUpperCase()+name.substring(1).toLowerCase();
return newname;
}
return arr.map(changetoName);
}
练习3:
小明希望利用map()把字符串变成整数,他写的代码很简洁:
var arr = ['1', '2', '3'];
var r;
r = arr.map(parseInt);
alert('[' + r[0] + ', ' + r[1] + ', ' + r[2] + ']');
结果竟然是[1, NaN, NaN],小明百思不得其解,请帮他找到原因并修正代码。
arr.map会为调用的函数传入以下三个参数:
1、currentValue,数组中当前被传递的元素。
2、index,数组中当前被传递的元素的索引。
3、array,调用 map 方法的数组。
而parseInt可以接受两个参数:
1、string:必需。要被解析的字符串。
2、radix:可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。
如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。
所以实际上是执行了:
parseInt(‘1’,0,[‘1’,’2’,’3’]);//1
parseInt(‘2’,1,[‘1’,’2’,’3’]);//NaN
parseInt(‘3’,2,[‘1’,’2’,’3’]);//NaN
所以修正的代码应为:
r = arr.map(function(x) { return parseInt(x,10) });
或者
r = arr.map(function(x) { return parseInt(x) });