zoukankan      html  css  js  c++  java
  • 常见面试题——['1','2','3'].map(parseInt)

      面试时经常会问到关于['1','2','3'].map(parseInt)的问题,很多时候回答的仅仅就是一个正确的答案,对于更深入的原理却并不怎么了解,下面就对该问题做一下详解。

      面试经常会问:

    1 ['1','2','3'].map(parseInt) 

      上述问题的答案是什么?对此,先不来探讨这个题的答案是什么,从后面的解释中一步步得到答案,先认识一下 parseInt() 函数,parseInt() 函数解析一个字符串参数,并返回一个指定基数的整数

      语法:

    1 let m = parseInt( string[, radix] );

      string:要被解析的值。若参数不是字符串,则会被隐式转换成字符串( toString()方法 )。字符串开头的空白符将会被忽略。

      radix一个介于2和36之间的整数(不包含36),表示上述字符串的基数。默认为10。返回值:返回一个整数或者NaN(基数就是类似的进制数)(特别的:当radix为0时会当做默认10进制处理)。

      个人理解:parseInt函数会根据基数的值去解析字符串,其中基数类似进制数,(如:2进制:0,1,遇2进1;3进制:0,1,2,遇3进1 ...)解析时会忽略掉字符串中比进制数大的数(若忽略完了就解析空字符串,即NaN)

      栗子

    1 parseInt(100,3)        // (1*3^2)+(0*3^1)+(0*3^0) = 9
    2 
    3 parseInt(15,3)          // 会忽略比3大的数5,直接解析数字1,即(1*3^0) = 1
    4     
    5 parseInt(6,3)            // 忽略比3大的数字6,解析空字符串,即 NaN
    6 
    7 parseInt(250,3)        // 忽略比3大的数字5,且数字5后面的也会被忽略,2*3^0 = 2

      扩展:基数(radix)的范围为什么会是 2~36(不包含36)?我们都知道进制数中最小为2进制,对于16进制来说,数字10以上就只能用字母表示,即:a = 10,b = 11,c = 12,...,z = 35,所以基数的最大值为35。

      补充:和 parseInt 类似的另一个方法 parseFloat 则没有这么复杂了,解析时只会按照十进制方式解析字符串。

      注意:在 radix undefined,或者 radix 为 0 或者没有指定的情况下,js机制会做以下处理:

    • 若字符串 string 以" 0x " 或 " 0X "开头,则基数为16(十六进制)
    • 若字符串 string 以" 0 "开头,则基数是8(八进制)或者10(十进制),具体采用哪个是由当时环境决定,ECMScript 5 规定使用10,但不是所有浏览器都遵循该规定,故遇到该情况时需要给定 radix 值
    • 若字符串 string 以其他任何值开头,则基数是10(默认十进制)

      接着再来介绍一下 map() 方法,map() 方法创建一个新的数组,其结果是该数组中的每个元素都调用一个提供的函数(callback)后返回的结果。

    let newArray = arr.map(function 
        callback( currentValue[,index[, array]] ){
        // return element for newArray
    }[, thisArg])

      根据上述语法可以看到 callback 回调函数需要三个参数,实际中通常只使用第一个参数(其他两个参数是可选的)。currentValue 是 callback 数组中正在处理的当前元素。index可选,是 callback 数组中正在处理的当前元素的索引。array 可选,是 callback map 方法被调用的数组。另外还有 thisArg 可选,是执行 callback 函数时使用的 this 值。

    let arr = [ 3,4,5 ];
    
    let newArray = arr.map( (num)=>num+1 );
    
    console.log( newArray );        // [ 4,5,6 ]

      在  [ '1', '2', '3' ].map( parseInt )例子中,对于每个迭代 map,parseInt 会传递两个参数:字符串和基数。所以实际上执行的代码为:

     1 ['1', '2', '3'].map( (item,index)=>{
     2       console.log( item,index )
     3       return parseInt( item,index )
     4 })
     5 
     6 /*
     7   打印的结果为:
     8     '1'     0    
     9     '2'     1
    10     '3'     2
    11 */
    12 
    13 /*
    14   返回值
    15    parseInt( '1', 0 )
    16    parseInt( '2', 1 )
    17    parseInt( '3', 2 )        
    18 */

      所以最终 [ '1', '2', '3' ].map( parseInt )的结果为 1 NaN NaN。

  • 相关阅读:
    (uC/OS-II学习笔记) 事件标志……
    (uC/OS-II学习笔记) 消息邮箱&&消息队列
    (uC/OS-II学习笔记)关于共享资源与信号量
    (uC/OS-II学习笔记)uC/OS-II 时间管理
    (uC/OS-II学习笔记)uC/OS-II在kinetis K60上移植与任务建立
    (Kinetis K60)RTC实时时钟
    (Kinetis K60)flash读写
    JQuery官方学习资料(译):避免与其他库的冲突
    JQuery官方学习资料(译):$( document ).ready()
    JQuery官方学习资料(译):$ vs $()
  • 原文地址:https://www.cnblogs.com/zsp-1064239893/p/12286842.html
Copyright © 2011-2022 走看看