总结XXI-字符串常用代码

165 阅读2分钟

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'
    }
}