搜集整理经典面试题

一、 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() 

你可能感兴趣的