美文网首页
搜集整理经典面试题

搜集整理经典面试题

作者: 易冷zzz | 来源:发表于2021-02-26 13:44 被阅读0次

    一、 arr.map(parseInt)

    示例:

    console.log(['1', '2', '3'].map(parseInt))
    //1
    //NaN
    //NaN
    

    解析:

    parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数, radix 是2-36之间的整数,表示被解析字符串的基数。
    map() 方法创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值。
    接收2个参数:1.回调函数:接收3个返回值,分别是正在处理的当前元素(必须),当前元素索引(可选),map方法调用的数组(可选)。2.执行回调函数时的this(可选),形式如下:

    var new_array = arr.map(function callback(currentValue[, index[, array]]) {
     // Return element for new_array 
    }[, thisArg])
    

    有上述可知:

    ['1', '2', '3'].map(parseInt)
    //等效于:
    parseInt(1, 0, ['1', '2', '3'])
    parseInt(2, 1, ['1', '2', '3'])
    parseInt(3, 2, ['1', '2', '3'])
    

    如果看到这里还不太理解那么把parseInt换成自定义函数parse继续往下看相信你会豁然开朗:

    let arr = ['1', '2', '3']
    console.log(arr.map(parse))
    function parse(param1, param2, param3) {
        return parseInt(param1, param2)
    }
    

    二 0.1+0.2不等于0.3的问题

    1.问题

    console.log(0.1 + 0.2)  //0.30000000000000004
    

    2. 分析
    由于计算机底层存储都是基于二进制的,需要事先由十进制转换为二进制存储与运算,这整个转换过程中,类似于 0.1、0.2 这样的数是无穷尽的,无法用二进制数精确表示。JavaScript 采用的是 IEEE 754 双精确度标准,能够有效存储的位数为 52 位,所以就需要做舍入操作,这无可避免的会引起精度丢失。另外我们在 0.1 与 0.2 相加做对阶、求和、舍入过程中也会产生精度的丢失。
    关于浮点数运算的底层逻辑参考该文档
    3. 解决方案
    使用BigNumber.js,一个用于任意精度计算的js库。大概原理是将所有数字当做字符串,重新实现了计算逻辑。缺点是性能比原生的差很多。

    let x = new BigNumber(0.1)
    let y = 0.2
    console.log(parseFloat(x.plus(y)))//0.3
    

    4.附BigNumber.js常用方法

    // 转为 bignumber
    const x= new BigNumber('123456789.123456789');
    // 转为 普通数字
    x.toNumber()
    
    // 格式化(小数点)
    x.toFormat()    // '123,456,789.123456789'
    x.toFormat(3)   // '123,456,789.123'
    
    // 计算
    x.plus(0.1)  // 加法
    x.minus(0.1)  // 减法
    x.times(0.1)  // 乘法
    x.div(0.1)  // 除法
    x.mod(3)  // 取模/取余
    
    // 比较大小
    x.eq(y) // isEqualTo 的简写,是否相等
    Future home of x.gt(y) // isGreaterThan 的简写,是否大于
    x.gte(y) // isGreaterThanOrEqualTo 的简写,是否大于等于
    x.lt(y) // isLessThan 的简写,是否小于
    x.lte(y) // isLessThanOrEqualTo 的简写,是否小于等于
    
    // 取非,改变数字的正负号
    x.negated() 
    

    相关文章

      网友评论

          本文标题:搜集整理经典面试题

          本文链接:https://www.haomeiwen.com/subject/xvlmfltx.html