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ī)定的字段