1.实现思路
- 参数验证
- 二分法实现补充
- 奇数除以二都为偶数
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.实现深度拷贝
- 关键点为需要考虑到数组和null这两个特殊的对象
- 如果直接使用JSON.parse(JSON.stringify(obj)),则无法拷贝对象中的函数
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
设置setInterval定时器后,当要向任务队列里添加代码实例时,如果任务队列里面已经存在代码实例,则不会添加,这就会导致setInterval并不一定是准确的事件,可能会有以下情况:
- 定时任务设置2s,任务队列被阻塞了,上一个任务延后1s执行,那么任务间隔缩短到了1s
- 定时任务设置2s,任务队列被阻塞了,上一个任务还没完成,下一个任务不会添加,直接跳过了
setInterval(()=>console.log('red'),1000);
//定时函数
function sleep(time){
var now=Date.now();
while(true){
var t=Date.now();
if(t-now>=time){
break;
}
}
}
sleep(5000);
而递归调用setTimeout则可以执行完上一个任务后,再过1s执行下一个任务,保证任务间隔会大于等于1s
4.获取服务器时间的方法
可以通过ajax获取服务器响应,从响应头部中的Date拿到服务器时间
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);
});
- 客户端无法获取响应中的Set-Cookie,Set-Cookie2这两个字段,无论是同域还是跨域请求
- 对于跨域请求,客户端可以获取的字段只有与缓存和主体类型相关的字段,和Access-Control-Expose-Headers中规定的字段
网友评论