1. 给字符串的原型链上添加一个方法,实现字符串翻转
实现效果: 输入str = 'abc' ,输出str = 'cba'
String.prototype.myfn = function(a){//注意S大写
return a.split("").reverse().join("");
}
var obj= new String();
var a= obj .myfn ('wanru');
console.log(a); //urnaw
2. 大数相加
JavaScript Number的精度丢失问题
因为JavaScript的Number类型是遵循IEEE 754规范表示的,这就意味着JavaScript能精确表示的数字是有限的,JavaScript可以精确到个位的最大整数是9007199254740992,也就是2的53次方,超过这个范围就会精度丢失,造成JavaScript无法判断大小。
如何进行一个大于2的53次方的数运算
面试高频考点,俗称“大数相加”,主要考查是否了解JavaScript的数值类型的底层原理,以及超出精度下的超大数计算思想。
function bigNumAdd(num1, num2) {
// 首先检查传来的大数是否是字符串类型,如果传Number类型的大数,在传入的时候已经丢失精度了
const checkNum = num => typeof num === 'string' && !isNaN(Number(num))
if (checkNum(num1) && checkNum(num2)) {
// 将传入的数据进行反转,从前向后依次加和,模拟个,十,百依次向上加和
const tmp1 = num1.split('').reverse()
const tmp2 = num2.split('').reverse()
const result = []
// 格式化函数,主要针对两个大数长度不一致时,超长的数字的格式化为0
const format = val => {
if( typeof val === 'number') return val
if(!isNaN(Number(val))) return Number(val)
return 0
}
let temp = 0
// 以较长的数字为基准进行从前往后逐个加和,为避免两个数相加最高位进位后,导致结果长度大于两个数字中的长度,for循环加和长度为最长数字长度加一
for (let i = 0; i <= Math.max(tmp1.length, tmp2.length); i++) {
const addTmp = format(tmp1[i]) + format(tmp2[i]) + temp
// 当加和的数字大于10的情况下,进行进位操作,将要进位的数字赋值给temp,在下一轮使用
result[i] = addTmp % 10
temp = addTmp > 9 ? 1 : 0;
}
// 计算完成,反转回来
result.reverse()
// 将数组for中多加的一位进行处理,如果最高位没有进位则结果第一个数位0,结果第一个数位1,则发生了进位,第一位保留。
const resultNum = result[0] > 0
? result.join('')
: result.join('').slice(1)
console.log('result', resultNum)
} else {
return 'big number type error'
}
}