对localStorage进行二次封装,增加数据有效期限制

十分钟前做了cvte的前端笔试题,说实话做的真的爽,好多题考的细节很到位,很多坑可能跳过,但后面都逐渐忘却了,值此机会记录一下最后一道题(不算泄密吧,如果算马上删):localStorage的存储时间有限制,请进行二次封装,能让存储有数据有时间限制。
我当时的作答如下(还有很多点可优化,比如修改为设置每一次数据的有效期而非所有):

const newStorage = {
    storage: "",
    length: 0,
    limit: 1000,
    init(t) {
        this.storage = localStorage;
        this.length = this.storage.length;
        this.limit = t;
    },
    setItem(key,val) {
        this.storage.setItem(key,val);
        let limit = this.limit;
        if(limit) setTimeout(()=>{this.removeItem(key)},limit) 
    },
    getItem(key) {
        this.storage.getItem(key)
    },
    removeItem(key){
        this.storage.removeItem(key)
    },
    clear() {
        this.storage.clear();
    }
}

原谅我当时没想起来length属性,后面加的。。。而且还不能用stor.foo=bar和stor[foo]=bar的方式添加属性。所以这种写法存在较多弊端,后来想到就是通过遍历_proto_来复制属性内容,然后再重写setItem。经修改代码如下:

const newStorage = {
    init(t) {
        for(var a in localStorage){           
            newStorage[a] = localStorage[a];
        }
        this.setItem = (key,val) => {
            localStorage.setItem(key,val);
            if(t) setTimeout(()=>{localStorage.removeItem(key)},t) 
        }
    }
}

想法不错,不过这明眼人很快就能发现问题,里面夹杂了对象拷贝,咱们的newStorage只是和localStorage拥有了一样的属性,然后并不能拥有这些属性方法的功能,所以更好的方案还有待商榷。

顺便扯一下第一题:
第一道编程题,要求如下:
实现一个函数,输入的数组是2n项,则把这数组以2个为一组分割,并使每个分割后的数组的最小值相加最大,并输出。
例如:【1,4,3,2】输出为4;
【1,5,7,9,4,12】输出为15.

function group(arr){
    arr.sort();
    return arr.reduce((c,n,i)=>{
        if(i%2!=0) n=0;
        return c+n
    })
}

em…是的,就这样就满足了。

猜你喜欢

转载自blog.csdn.net/qq_39300332/article/details/79511572