练习

    请把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入: ['adam', 'LISA', 'barT'] ,输出: ['Adam', 'Lisa', 'Bart']

    'use strict';



    function normalize(arr) {



    return [];



    }



    // 测试:

    if (normalize(['adam', 'LISA', 'barT']).toString() === ['Adam', 'Lisa', 'Bart'].toString()) {

    alert('测试通过!');

    }

    else {

    alert('测试失败!');

    }

    小明希望利用 map() 把字符串变成整数,他写的代码很简洁:

    'use strict';



    var arr = ['1', '2', '3'];

    var r;



    r = arr.map(parseInt);



    alert('[' + r[0] + ', ' + r[1] + ', ' + r[2] + ']');

    结果竟然是 [1, NaN, NaN] ,小明百思不得其解,请帮他找到原因并修正代码。

    提示:参考 Array.prototype.map()的文档

    <button id="x-why-parseInt-failed" class="uk-button uk-button-success">原因分析</button>

    由于 map() 接收的回调函数可以有3个参数: callback(currentValue, index, array) ,通常我们仅需要第一个参数,而忽略了传入的后面两个参数。不幸的是, parseInt(string, radix) 没有忽略第二个参数,导致实际执行的函数分别是:

    • parseInt('0', 0); // 0, 按十进制转换

    • parseInt('1', 1); // NaN, 没有一进制

    • parseInt('2', 2); // NaN, 按二进制转换不允许出现2

    可以改为 r = arr.map(Number); ,因为 Number(value) 函数仅接收一个参数。