看了下网上的都是不完善的,只能自己写了一个:
// parseInt()函数定义:
// 1. 如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN,也就是说,用parseInt()转换空字符串会返回NaN,若首字符为正号,则后面必须跟有数字,否则返回NaN。
// 2. 如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。
// 3. 如果字符串以”0x”开头且后跟数字字符,就会将其当作一个十六进制整数。
// 4. parseInt()的第二个参数表示第一个参数字符串原本是多少进制的数。
// 5. 当parseInt()函数所解析的是浮点数字符串时,取整操作所使用的方法为"向下取整"
// 流程:
// 1. 判断第一个参数是否为空
// 2. 字符串转换并校验,入参必须是字符串
// 3. 去除前后空格
// 4. 判断正负
// 5. 判断是否为16进制数
// 6. 去除前面的0
// 7. 判断第二个参数是否合法(有没有值/范围/类型),并赋值默认值
// 8. 截断小数
// 9. 累加计算
function _parseInt(str, radix) {
if (typeof str === 'number') str = str.toString()
if (typeof str !== 'string' || str === '') return NaN
let isPositive = true
str = str.replace(/^\s+/, '').replace(/\s+$/, '')
if (/^[+-]/.test(str)) {
isPositive = str[0] === '+'
str = str.slice(1)
}
if (/^0x[\da-zA-Z]+/.test(str)) {
str = str.slice(2)
if (!radix) {
radix = 16
} else if (radix !== 16) {
return radix >= 2 && radix <= 36 ? 0 : NaN
}
}
str = str.replace(/^0+/, '')
if (!radix || radix === 0 || typeof radix !== 'number') radix = 10
if (radix < 2 || radix > 36) return NaN
if (/^.*\..*/.test(str)) str = str.match(/^.*(?=\.)/g)[0]
let result = 0
for (const letter of str) {
let num = letter.charCodeAt(0)
if (letter >= 'A' && letter <= 'Z') {
num = num - 'A'.charCodeAt(0) + 10
} else if (letter >= 'a' && letter <= 'z') {
num = num - 'a'.charCodeAt(0) + 10
} else if (letter >= '0' && letter <= '9') {
num = num - '0'.charCodeAt(0)
} else {
break
}
if (num >= radix) break
result = result * radix + num
}
return isPositive ? result : -result
}