實(shí)現(xiàn)倒計(jì)時(shí)模塊方法

1.實(shí)現(xiàn)思路

  • 參數(shù)驗(yàn)證
  • 二分法實(shí)現(xiàn)補(bǔ)充
  • 奇數(shù)除以二都為偶數(shù)
function leftpad(str, len, ch) {
    str = String(str);
    len = len - str.length;
    if (len <= 0) {
        return str;
    }
    if (!ch && ch !== 0) {
        ch = ' ';
    }
    ch = String(ch);

    var pad = '';
    while (true) {
        if (len & 1) {
            pad += ch;
        }
        len >>= 1;
        if (len) {
            ch += ch;
        } else {
            break;
        }
    }
    return pad + str;
}

2.實(shí)現(xiàn)深度拷貝

  • 關(guān)鍵點(diǎn)為需要考慮到數(shù)組和null這兩個(gè)特殊的對(duì)象
  • 如果直接使用JSON.parse(JSON.stringify(obj)),則無(wú)法拷貝對(duì)象中的函數(shù)
function copy(obj){
    if(typeof obj !== 'object' || obj===null){
        return obj;
    }

    var res=Array.isArray(obj)?[]:{};
    for(var i in obj){
        res[i]=copy(obj[i]);
    }
    return res;
}

3.深入理解setInterval

設(shè)置setInterval定時(shí)器后,當(dāng)要向任務(wù)隊(duì)列里添加代碼實(shí)例時(shí),如果任務(wù)隊(duì)列里面已經(jīng)存在代碼實(shí)例,則不會(huì)添加,這就會(huì)導(dǎo)致setInterval并不一定是準(zhǔn)確的事件,可能會(huì)有以下情況:

  • 定時(shí)任務(wù)設(shè)置2s,任務(wù)隊(duì)列被阻塞了,上一個(gè)任務(wù)延后1s執(zhí)行,那么任務(wù)間隔縮短到了1s
  • 定時(shí)任務(wù)設(shè)置2s,任務(wù)隊(duì)列被阻塞了,上一個(gè)任務(wù)還沒(méi)完成,下一個(gè)任務(wù)不會(huì)添加,直接跳過(guò)了
setInterval(()=>console.log('red'),1000);

//定時(shí)函數(shù)
function sleep(time){
    var now=Date.now();
    while(true){
        var t=Date.now();
        if(t-now>=time){
            break;
        }
    }
}

sleep(5000);

而遞歸調(diào)用setTimeout則可以執(zhí)行完上一個(gè)任務(wù)后,再過(guò)1s執(zhí)行下一個(gè)任務(wù),保證任務(wù)間隔會(huì)大于等于1s

4.獲取服務(wù)器時(shí)間的方法

可以通過(guò)ajax獲取服務(wù)器響應(yīng),從響應(yīng)頭部中的Date拿到服務(wù)器時(shí)間

function getNowTime(callback){
    var xhr=new XMLHttpRequest();
    xhr.onreadystatechange=function(){
        if(xhr.readyState===3){
            var now=xhr.getResponseHeader('Date');
            callback(now);
            xhr.abort();
        }
    }
    xhr.open('get','/',true);
    xhr.send(null);
}

getNowTime((now)=>{
    console.log(now);
});
  • 客戶端無(wú)法獲取響應(yīng)中的Set-Cookie,Set-Cookie2這兩個(gè)字段,無(wú)論是同域還是跨域請(qǐng)求
  • 對(duì)于跨域請(qǐng)求,客戶端可以獲取的字段只有與緩存和主體類型相關(guān)的字段,和Access-Control-Expose-Headers中規(guī)定的字段
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,711評(píng)論 19 139
  • 最近在閱讀這本Nicholas C.Zakas(javascript高級(jí)程序設(shè)計(jì)作者)寫的最佳實(shí)踐、性能優(yōu)化類的書...
    undefinedR閱讀 2,251評(píng)論 0 30
  • 一、多線程 說(shuō)明下線程的狀態(tài) java中的線程一共有 5 種狀態(tài)。 NEW:這種情況指的是,通過(guò) New 關(guān)鍵字創(chuàng)...
    Java旅行者閱讀 4,874評(píng)論 0 44
  • 8月11日,環(huán)衛(wèi)局渣管科安排部署執(zhí)法人員43名,車輛12臺(tái),采取設(shè)立檢查點(diǎn)和,24小時(shí)不間斷巡查的方式,檢...
    wuouwuouou閱讀 196評(píng)論 0 0
  • 今天突然遇到在我的mac 電腦瀏覽器 餅圖效果如下圖1 未修改前代碼 在看文檔中找到一個(gè)屬性 minAngle 最...
    六六球閱讀 5,396評(píng)論 0 0

友情鏈接更多精彩內(nèi)容