手写系列

192 阅读1分钟

1 大数相加问题

        因为 js的 Number 是IEEE 754标准的64-bits的双精度数值,就是说在 2^53即以内的整数都是精确的,但是超过了这个范围就会出现精度丢失,最大安全值是2^53-1

        解决方法的思路是以字符串的形式按位来相加,即我们平时计算加法一样,个位与个位相加,超过十就进一位的思路

let sumBig = function(a,b){
    a = a.split('') ;
    b = b.split('')  let alength = a.length; 
    let blength = b.length;  
    if(alength>blength){   
        for(let i=0;i<(alength-blength);i++){    
            b.unshift('0')  
        }  
    }else if(blength>alength){ 
        for(let i=0;i<blength-alength+1;i++){  
            a.unshift('0')   
        } 
    }  
    //⬆使位数相同,不足的用0填充

    let newArr = [];//初步结果数组 

    //初步相加⬇  
    for(let i=0;i<a.length;i++){   
        newArr[i] = Number(a[i])+Number(b[i]); 
    }   

    var n = 0; //进位 
    //⬇大于10的位数进一位  
    for(let i = 0;i<newArr.length;i++){
        if(i===newArr.length-1){ 
            newArr[newArr.length-i-1] = (newArr[newArr.length-i-1]+n)  
        }else{   
            if(newArr[newArr.length-i-1]+n>9){ 
               newArr[newArr.length-i-1] = (newArr[newArr.length-i-1]+n)%10;    
                n=1     
            }else{    
                newArr[newArr.length-i-1] = newArr[newArr.length-i-1]+n;    
                n=0;     
            }   
        }   
    }   
    return newArr.join('')  
}

let rusult1 = sumBig('9999999999999999999999999','9999')
console.log(rusult1)

2 手写模版字符串方法

//模版字符串

const temple = "I'm {{name}}. I'm {{age}} years old.";
const data = { name: "aa", age: "10" };
String.prototype.render = function (data) {
    return this.replace(/{{(.*?)}}/g, (match, key) => data[key.trim()]);
};
const result = temple.render(data);